我正在尝试在Batik中缩放和翻译SVG图像。 要进行缩放我使用
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);
第一次转型是正确的。第二个导致垃圾,但再次应用原始的(或逆的倒数)会导致正确的结果。
实际上,有两个问题:
答案 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);