2014-02-13 48 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);