【问题标题】:SVG to PNG - BatikSVG 转 PNG - 蜡染
【发布时间】:2015-12-19 16:51:30
【问题描述】:

使用 Apache Batik 从 SVG 转换为 PNG 时,有时会出现奇怪的错误。例如对于这个 SVG https://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg 它会抛出一个异常,但对于这个 https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg 不会抛出一个异常

这是我的代码:

package com.stackoverflow.batik;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.batik.transcoder.SVGAbstractTranscoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class Converter {

    public static BufferedImage convertSVGToPNG(String url) throws TranscoderException, IOException {
        ByteArrayOutputStream resultByteStream = new ByteArrayOutputStream();

        TranscoderInput transcoderInput = new TranscoderInput(url);
        TranscoderOutput transcoderOutput = new TranscoderOutput(resultByteStream);

        PNGTranscoder pngTranscoder = new PNGTranscoder();
        pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_HEIGHT, 256f);
        pngTranscoder.addTranscodingHint(SVGAbstractTranscoder.KEY_WIDTH, 256f);
        pngTranscoder.transcode(transcoderInput, transcoderOutput);

        resultByteStream.flush();

        return ImageIO.read(new ByteArrayInputStream(resultByteStream.toByteArray()));
    }

    public static void main(String args[]) throws TranscoderException, IOException {
        BufferedImage image = convertSVGToPNG("https://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg");
        assert image.getWidth() == 256;
        assert image.getHeight() == 256;
    }
}

这是个例外

Exception in thread "main" org.apache.batik.transcoder.TranscoderException: null
Enclosed Exception:
The current document is unable to create an element of the requested type (namespace: http://www.w3.org/2000/svg, name: description).
        at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source)
        at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source)
        at com.stackoverflow.batik.Converter.convertSVGToPNG(Converter.java:25)
        at com.stackoverflow.batik.Converter.main(Converter.java:33)

我做错了吗?

【问题讨论】:

    标签: java apache svg png batik


    【解决方案1】:

    SVG 没有描述标签。我假设您打算写 <desc> which does exist

    Chrome 和其他浏览器会忽略未知标签。蜡染也应该,但没有。在将描述标记提供给 Batik 之前,您始终可以使用 XSLT 转换(或其他一些机制)将描述标记替换为 desc 标记。

    【讨论】:

    • SVG 不是我的,它适用于 Chrome 和其他软件。所以我认为它也应该适用于 Apache Batik。
    • 好的,感谢您的澄清。 Batik 没有任何提示可以忽略未知标签?
    • 嗯,那是……尴尬。不过,你有没有碰巧知道 Batik 不知道的其他常用标签?
    • description 不是常用的标签。这是一个错字。
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 2019-06-13
    • 2017-07-15
    • 2018-08-10
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多