gpt4 book ai didi

java - 如何从 SVG 中获取 BufferedImage?

转载 作者:太空狗 更新时间:2023-10-29 22:32:40 26 4
gpt4 key购买 nike

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

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

最佳答案

使用 Batik ,像这样:

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];
}

关于java - 如何从 SVG 中获取 BufferedImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11435671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com