我使用batik libary在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
总是返回单位矩阵,所以这些点保持不变。也许我的代码出错了?
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结构中的PolyLine元素之一。
答案 0 :(得分:0)
现在正在运作。在第一次编辑中使用该方法。将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
上的操作。