Swing & Batik:从 SVG 文件创建 ImageIcon?
简而言之,我正在寻找一种使用蜡染库从SVG文件制作ImageIcon的方法。我不想先将SVG光栅到磁盘,我只想能够从jar文件中提取一个svg并将其作为UI元素登陆。
我觉得这应该相当容易,但是蜡染javadocs并没有告诉我我需要知道什么。
(为什么是蜡染?好吧,我们已经在使用它,所以我们不必运行另一个合法的库。
简而言之,我正在寻找一种使用蜡染库从SVG文件制作ImageIcon的方法。我不想先将SVG光栅到磁盘,我只想能够从jar文件中提取一个svg并将其作为UI元素登陆。
我觉得这应该相当容易,但是蜡染javadocs并没有告诉我我需要知道什么。
(为什么是蜡染?好吧,我们已经在使用它,所以我们不必运行另一个合法的库。
这真的很容易,只是不是很直观。
您需要扩展 .在分配 的方法中,将其缓存为成员变量,然后返回它。该方法是空的。您需要添加一个 getter 来检索 .ImageTranscoder
createImage
BufferedImage
writeImage
BufferedImage
它看起来像这样:
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周时间就弄清楚了。叹息。
我刚刚遵循了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。