使用蜡染获得svg折线的变换点

时间:2016-07-06 15:22:02

标签: java svg transformation batik

我使用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更改为已解析折线点的边界框,并将widthheight参数更改为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元素之一。

1 个答案:

答案 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上的操作。