如何从SVG获取BufferedImage?

我正在使用蜡染来处理SVG图像。有什么办法可以从SVG文件中获取java.awt.image.BufferedImage吗?

我知道有一些转码器,我可以使用它们将SVG转码为PNG,然后使用ImageIO.read()加载该PNG,但是我不想拥有临时文件。

回答:

使用蜡染,如下所示:

public static BufferedImage rasterize(File svgFile) throws IOException {

final BufferedImage[] imagePointer = new BufferedImage[1];

// Rendering hints can't be set programatically, so

// we override defaults with a temporary stylesheet.

// These defaults emphasize quality and precision, and

// are more similar to the defaults of other SVG viewers.

// SVG documents can still override these defaults.

String css = "svg {" +

"shape-rendering: geometricPrecision;" +

"text-rendering: geometricPrecision;" +

"color-rendering: optimizeQuality;" +

"image-rendering: optimizeQuality;" +

"}";

File cssFile = File.createTempFile("batik-default-override-", ".css");

FileUtils.writeStringToFile(cssFile, css);

TranscodingHints transcoderHints = new TranscodingHints();

transcoderHints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.FALSE);

transcoderHints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION,

SVGDOMImplementation.getDOMImplementation());

transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI,

SVGConstants.SVG_NAMESPACE_URI);

transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, "svg");

transcoderHints.put(ImageTranscoder.KEY_USER_STYLESHEET_URI, cssFile.toURI().toString());

try {

TranscoderInput input = new TranscoderInput(new FileInputStream(svgFile));

ImageTranscoder t = new ImageTranscoder() {

@Override

public BufferedImage createImage(int w, int h) {

return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

}

@Override

public void writeImage(BufferedImage image, TranscoderOutput out)

throws TranscoderException {

imagePointer[0] = image;

}

};

t.setTranscodingHints(transcoderHints);

t.transcode(input, null);

}

catch (TranscoderException ex) {

// Requires Java 6

ex.printStackTrace();

throw new IOException("Couldn't convert " + svgFile);

}

finally {

cssFile.delete();

}

return imagePointer[0];

}

以上是 如何从SVG获取BufferedImage? 的全部内容, 来源链接: utcz.com/qa/423899.html

回到顶部