2014-02-13 49 views
1

我想要在蜡染中缩放和翻译SVG图像。 为此我使用在Batik中应用多个AffineTransformations

AffineTransform at= new AffineTransform(); 
at.scale(sx, sy); 
at.translate(tx, ty); 
canvas.setRenderingTransform(at, true); 

后,我发现工作得很好(变焦,该sxsytxty值必须屏幕坐标,不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);