亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 420 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號