2014-02-13 3 views
1

Batik에서 SVG 이미지를 확장 및 변환하려고합니다. sx, sy, txty 값이 화면이어야 내가Batik에서 다중 AffineTransformations 적용

내가 발견 한 후 (매우 잘 작동
AffineTransform at= new AffineTransform(); 
at.scale(sx, sy); 
at.translate(tx, ty); 
canvas.setRenderingTransform(at, true); 

을 사용하여 줌을 수행하지 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);