使用蜡染获取 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 更改为解析折线点的边界框,并将 widthheight 参数更改为 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上的操作。