Java Batik 将 SVG 调整为面板大小,保持纵横比

我正在尝试在我的 Swing 应用程序上显示一个 SVG 图像,因为我没有一个 SVG 文件但是一个路径我正在将路径转换为一个有效的 svg 文档:


private static Document buildSVGDocument(Color svgColor, /*double svgWidth, double svgHeight,*/ String svgPath) {

    DOMImplementation svgDocumentImplementation = SVGDOMImplementation.getDOMImplementation();

    Document svgDocument = svgDocumentImplementation.createDocument(SVGDOMImplementation.SVG_NAMESPACE_URI, "svg", null);


    Element svgDocumentElement = svgDocument.getDocumentElement();

    //svgDocumentElement.setAttribute("height", String.valueOf(svgHeight));

    //svgDocumentElement.setAttribute("width", String.valueOf(svgWidth));


    Element svgDocumentPath = svgDocument.createElementNS(SVGDOMImplementation.SVG_NAMESPACE_URI, "path");

    svgDocumentPath.setAttribute("style", String.format("fill:rgb(%s, %s, %s);", svgColor.getRed(), svgColor.getGreen(), svgColor.getBlue()));

    svgDocumentPath.setAttribute("d", svgPath);

    svgDocumentElement.appendChild(svgDocumentPath);


    return svgDocument;

}

然后我在蜡染画布上显示 SVG 文档:


JSVGCanvas panel = new JSVGCanvas();

panel.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);

panel.setDisableInteractions(true);

panel.setDocument(buildSVGDocument(/*etc*/));

container.add(panel, BorderLayout.WEST);

现在我的问题是:如何将 svg 调整为面板大小以保持纵横比?


慕哥9229398
浏览 368回答 1
1回答

肥皂起泡泡

我想出了怎么做!,浏览源我找到了用于计算图像比例的方法,它是:calculateViewingTransform然后我实现了一个简单的类来将图像缩放到容器public class SVGCanvas extends JSVGCanvas {    private static final long serialVersionUID = 1L;    /**     * The type of scale     */    private short svgScale;    /**     * Image padding     */    private int svgPadding;    public SVGCanvas() {        this.svgScale = SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX;        this.svgPadding = 5;    }    @Override    protected AffineTransform calculateViewingTransform(String svgElementIdentifier, SVGSVGElement svgElement) {        SVGRect svgElementBounds = svgElement.getBBox();        float[] svgElementBoundsVector = new float[] {            svgElementBounds.getX(),            svgElementBounds.getY(),            svgElementBounds.getWidth(),            svgElementBounds.getHeight()        };        float svgEemenetScaleToHeight = getHeight() - svgPadding;        float svgElementScaleToWidth = getWidth() - svgPadding;        return ViewBox.getPreserveAspectRatioTransform(            svgElementBoundsVector, svgScale, true,            svgElementScaleToWidth,            svgEemenetScaleToHeight        );    }    public void setSvgScale(short svgScale) {        this.svgScale = svgScale;    }    public void setSvgPadding(int svgPadding) {        this.svgPadding = svgPadding;    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java