Batik到SVG,设置缩放&画布的尺寸

时间:2016-07-30 17:36:19

标签: svg graphics2d vector-graphics batik

我们正在使用Batik,以便我们可以使用java Graphics2D(实际上是SVGGraphics2D)创建SVG文档。除缩放/调整大小外,一切都很好。

我们希望将EMU用于所有渲染的坐标。 (There are 914,400 EMUs/inch)。

关键代码是:

// set the userspace to scale to EMUs. All calls pass EMUs for coordinates and this maps it to the pixels.
public static final int EPI = 914400;
int dpi = getDPI(); // returns 600
AffineTransform scaleToEmus = AffineTransform.getScaleInstance(dpi / (float) EPI, dpi / (float) EPI);
graphics.transform(scaleToEmus);

// size (extent) of the SVG object.
svgGraphics.setSVGCanvasSize(new Dimension(width, height));

这会导致一些问题。最终,这会在<svg>元素上设置width和height属性。

<svg width="1466850" height="1200150" …

构造函数还应用仿射变换,该仿射变换将EMU缩放到像素。 SVG XML将包含类似

的内容
<g transform="matrix(0.0007,0,0,0.0007,0,0)" …

问题是转换不适用于<svg>的宽度和高度。它可以通过在构造函数

中显式应用比例来解决
svgGraphics.setSVGCanvasSize(new Dimension((int)Math.ceil(width * graphics.getTransform().getScaleX()), (int)Math.ceil(height * graphics.getTransform().getScaleY())));

但是,这并不适用于所有情况。例如,如果DPI = 600,宽度= 1466850(emu),则scaleX变为6.561679765582085E-4,缩放宽度变为963.但svg将包含矩阵(0.0007,...),这会导致形状不适合画布。这是一个产生矩阵元素的人围绕该值,以便6.561679765582085E-4 =&gt; 0.0007

解决方案可能是找出舍入算法并使用它来缩放画布大小。但我不喜欢调整数字以查看通过我特定用例的内容。

这个问题的建议方法是什么?

更新:答案是否可以通过定义viewBox来进行缩放?

0 个答案:

没有答案