Я пытаюсь масштабировать и переводить изображение SVG в Батик. Чтобы сделать зуммирование я используюПрименение нескольких AffineTransformations в Batik
AffineTransform at= new AffineTransform();
at.scale(sx, sy);
at.translate(tx, ty);
canvas.setRenderingTransform(at, true);
Это работает довольно хорошо (после того, как я узнал, что значения sx
, sy
, tx
и ty
должны быть координаты экрана, не SVG координаты.
Но я хочу разрешить несколько операций масштабирования. Проблема в следующем: мне не удается «добавить» другое преобразование в существующее.
Я попробовал это, сначала вернувшись к старой трансформации, а затем добавив новую. Но это приводит меня к другой проблеме: реверсия не работает! Это приводит к уменьшению изображения, чем оригинальное (таким образом, масштабирование).
Я экспериментировал немного и попытался применить преобразование, а затем применить обратное, а затем применить оригинал снова:
final AffineTransform at= new AffineTransform();
at.scale(zoom.sx, zoom.sy);
at.translate(zoom.tx, zoom.ty);
canvas.setRenderingTransform(at, true);
...
final AffineTransform reverseAt = at.createInverse();
canvas.setRenderingTransform(reverseAt, true);
...
final AffineTransform reverseBackAt= reverseAt.createInverse();
canvas.setRenderingTransform(reverseBackAt, true);
Первое преобразование является правильным. Второе приводит к мусору, но повторение исходного (или обратного обратного) снова приводит к правильному результату.
Так на самом деле, есть два вопроса:
- Что является лучшим способом, чтобы применить несколько операций масштабирования?
- Почему результат инверсного преобразования не то, что я ожидал?