Swing & Batik:从 SVG 文件创建 ImageIcon?

2022-09-02 03:46:03

简而言之,我正在寻找一种使用蜡染库从SVG文件制作ImageIcon的方法。我不想先将SVG光栅到磁盘,我只想能够从jar文件中提取一个svg并将其作为UI元素登陆。

我觉得这应该相当容易,但是蜡染javadocs并没有告诉我我需要知道什么。

(为什么是蜡染?好吧,我们已经在使用它,所以我们不必运行另一个合法的库。


答案 1

这真的很容易,只是不是很直观。

您需要扩展 .在分配 的方法中,将其缓存为成员变量,然后返回它。该方法是空的。您需要添加一个 getter 来检索 .ImageTranscodercreateImageBufferedImagewriteImageBufferedImage

它看起来像这样:

    class MyTranscoder extends ImageTranscoder {
        private BufferedImage image = null;
        public BufferedImage createImage(int w, int h) {
            image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
            return image;
        }
        public void writeImage(BufferedImage img, TranscoderOutput out) {
        }
        public BufferedImage getImage() {
            return image;
        }
    }

现在,要创建图像,请创建转码器的实例,并通过设置 为其传递所需的宽度和高度。最后,从转码器输入转码到空目标。然后调用转码器上的 getter 以获取图像。TranscodingHints

调用如下所示:

    MyTranscoder transcoder = new MyTranscoder();
    TranscodingHints hints = new TranscodingHints();
    hints.put(ImageTranscoder.KEY_WIDTH, width);
    hints.put(ImageTranscoder.KEY_HEIGHT, height);
    transcoder.setTranscodingHints(hints);
    transcoder.transcode(new TranscoderInput(url), null);
    BufferedImage image = transcoder.getImage();

很简单,对吧?(是的,没错。我只花了2周时间就弄清楚了。叹息。


答案 2

我刚刚遵循了Devon在Batik-1.7上的方法

但是,为了使它正常工作,我必须对 hints 对象进行以下添加:

MyTranscoder transcoder =new MyTranscoder()

DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
TranscodingHints hints = new TranscodingHints();
hints.put(ImageTranscoder.KEY_WIDTH, width); // e.g. width=new Float(300)
hints.put(ImageTranscoder.KEY_HEIGHT,height);// e.g. height=new Float(75)
hints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION, impl.getDOMImplementation());
hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI,SVGConstants.SVG_NAMESPACE_URI);
hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI,SVGConstants.SVG_NAMESPACE_URI);
hints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, SVGConstants.SVG_SVG_TAG);
hints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, false);

transcoder.setTranscodingHints(hints);
TranscoderInput ti=new TranscoderInput(uri)
transcoder.transcode(ti, null);
BufferedImage image = transcoder.getImage();

似乎在蜡染的XMLAbstractTranscoder(http://svn.apache.org/repos/asf/xmlgraphics/batik/tags/batik-1_7/sources/org/apache/batik/transcoder/XMLAbstractTranscoder.java)中更新了一些版本1.7。