为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2021-09-29 16:34:53
我正在尝试在我的 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 调整为面板大小以保持纵横比?
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我想出了怎么做!,浏览源我找到了用于计算图像比例的方法,它是:


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;

    }


}



查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 367 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信