使用蜡染获取 svg 折线的转换点
get transformed points of svg polyline using batik
我正在使用 batik 库解析 java 中只有一个折线元素的 svg 文件。这是一个示例 svg 文件:
<svg fill-rule="evenodd" height="0.38in" preserveAspectRatio="none"
stroke-linecap="round" viewBox="0 0 150 225" width="0.25in">
<style type="text/css">
.pen1 { stroke: rgb(0,0,0); stroke-width: 19; stroke-linejoin: round;}
</style>
<g>
<polyline class="pen1" fill="none" points="10.0,-95 132.0,2.5 10,105 "/>
</g>
<g/>
</svg>
之后,我对 dom 元素进行了一些操作,特别是将 viewBox 更改为解析折线点的边界框,并将 width
和 height
参数更改为 500px。
现在我正在寻找一种方法来提取折线的操作(缩放和平移)点。
知道如何做到这一点吗?
编辑 1
我尝试了 Robert Longson 建议的方法,但显然 getTransformToElement
总是 returns 单位矩阵,所以点保持不变。也许我的代码有问题?
if ((baseElement instanceof SVGLocatable) && (e instanceof SVGElement)) {
SVGSVGElement docSVGElement = (SVGSVGElement) baseElement;
SVGLocatable locatable = (SVGLocatable) baseElement;
SVGElement svgPolyline = (SVGElement) e;
SVGMatrix transformationMatrix = docSVGElement.createSVGMatrix();
transformationMatrix = locatable.getTransformToElement(svgPolyline);
for (Point2D p : points) {
SVGPoint svgPoint = docSVGElement.createSVGPoint();
svgPoint.setX((float) p.getX());
svgPoint.setY((float) p.getY());
SVGPoint svgPoint1 = svgPoint.matrixTransform(transformationMatrix);
normalizedPoints.add(new Point2D.Float(svgPoint1.getX(),svgPoint1.getY()));
}
}
e
是 dom 结构中的折线元素之一。
它正在运行。在第一次编辑中使用该方法。将 transformationMatrix = locatablePolyline.getCTM();
设置为转换矩阵就可以了。然后只需将矩阵应用于路径中的每个点。感谢罗伯特的提示!
不要忘记初始化 svg css dom 接口,例如使用以下代码:
Document doc = factory.createSVGDocument(f.toURI().toString());
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
builder.build(ctx, doc);
否则无法使用SVGLocatables
上的操作。
我正在使用 batik 库解析 java 中只有一个折线元素的 svg 文件。这是一个示例 svg 文件:
<svg fill-rule="evenodd" height="0.38in" preserveAspectRatio="none"
stroke-linecap="round" viewBox="0 0 150 225" width="0.25in">
<style type="text/css">
.pen1 { stroke: rgb(0,0,0); stroke-width: 19; stroke-linejoin: round;}
</style>
<g>
<polyline class="pen1" fill="none" points="10.0,-95 132.0,2.5 10,105 "/>
</g>
<g/>
</svg>
之后,我对 dom 元素进行了一些操作,特别是将 viewBox 更改为解析折线点的边界框,并将 width
和 height
参数更改为 500px。
现在我正在寻找一种方法来提取折线的操作(缩放和平移)点。
知道如何做到这一点吗?
编辑 1
我尝试了 Robert Longson 建议的方法,但显然 getTransformToElement
总是 returns 单位矩阵,所以点保持不变。也许我的代码有问题?
if ((baseElement instanceof SVGLocatable) && (e instanceof SVGElement)) {
SVGSVGElement docSVGElement = (SVGSVGElement) baseElement;
SVGLocatable locatable = (SVGLocatable) baseElement;
SVGElement svgPolyline = (SVGElement) e;
SVGMatrix transformationMatrix = docSVGElement.createSVGMatrix();
transformationMatrix = locatable.getTransformToElement(svgPolyline);
for (Point2D p : points) {
SVGPoint svgPoint = docSVGElement.createSVGPoint();
svgPoint.setX((float) p.getX());
svgPoint.setY((float) p.getY());
SVGPoint svgPoint1 = svgPoint.matrixTransform(transformationMatrix);
normalizedPoints.add(new Point2D.Float(svgPoint1.getX(),svgPoint1.getY()));
}
}
e
是 dom 结构中的折线元素之一。
它正在运行。在第一次编辑中使用该方法。将 transformationMatrix = locatablePolyline.getCTM();
设置为转换矩阵就可以了。然后只需将矩阵应用于路径中的每个点。感谢罗伯特的提示!
不要忘记初始化 svg css dom 接口,例如使用以下代码:
Document doc = factory.createSVGDocument(f.toURI().toString());
UserAgent userAgent = new UserAgentAdapter();
DocumentLoader loader = new DocumentLoader(userAgent);
BridgeContext ctx = new BridgeContext(userAgent, loader);
ctx.setDynamicState(BridgeContext.DYNAMIC);
GVTBuilder builder = new GVTBuilder();
builder.build(ctx, doc);
否则无法使用SVGLocatables
上的操作。