2014-02-13 2 views
1

Я пытаюсь масштабировать и переводить изображение 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); 

Первое преобразование является правильным. Второе приводит к мусору, но повторение исходного (или обратного обратного) снова приводит к правильному результату.

Так на самом деле, есть два вопроса:

  • Что является лучшим способом, чтобы применить несколько операций масштабирования?
  • Почему результат инверсного преобразования не то, что я ожидал?

ответ

1

Чтобы ответить на ваш первый вопрос, используйте AffineTransform.concatenate():

AffineTransform firstTransform = new AffineTransform(); 
at.scale(sx, sy); 
at.translate(tx, ty); 

// Example: double all sizes 
AffineTransform secondTransform = AffineTransform.getScaleInstance(2, 2) 

secondTransform.concatenate(firstTransform); 
canvas.setRenderingTransform(secondTransform, true);