在Batik中应用多个AffineTransformation

时间:2014-02-13 18:33:39

标签: svg zoom affinetransform batik inverse

我正在尝试在Batik中缩放和翻译SVG图像。 要进行缩放我使用

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 个答案:

答案 0 :(得分: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);