当前位置: 首页 > 知识库问答 >
问题:

SVG到PNG-蜡染

赵飞雨
2023-03-14

当使用Apache Batik从SVG转换为PNG时,我有时会出现奇怪的错误。例如,对于这个SVGhttps://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)

我做错什么了吗?

共有1个答案

彭存
2023-03-14

SVG没有描述标签。我想你是想写

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

 类似资料:
  • 有没有一种蜡染兼容的方法可以用SVG做自动文本换行? 我在网上找遍了,找不到确切的东西与HTML不兼容。我看到和朋友应该可以工作,但我似乎无法让他们正常工作。我也找不到一个确切有效的例子。 一个有效的 SVG 示例将不胜感激。

  • 问题内容: 我正在尝试按照本教程将d3.js SVG Vis转换为PNG服务器端(使用Node.js)http://eng.wealthfront.com/2011/12/converting- dynamic-svg-to- png-with.html 链接到完整代码: https : //gist.github.com/1509145 但是,每当尝试请求加载页面时,我都会不断收到此 错误 有人

  • 问题内容: 简而言之,我正在寻找一种使用蜡染库从SVG文件制作ImageIcon的方法。我不想先将SVG光栅化到磁盘上,我只想能够将一个svg从jar文件中拉出并将其作为UI元素放置。 我觉得这应该相当容易,但是蜡染的javadocs并没有告诉我我需要知道的内容。 (为什么要使用蜡染呢?好吧,我们已经在使用它了,所以我们不必在合法的情况下运行另一个图书馆。) 问题答案: 这确实很容易,但不是很直观

  • 问题内容: 我有一个学生卡SVG,其中有名称,id和其他字段,我想通过Java编辑,因为用户使用GUI输入了它们。 我已经使用Batik成功解析了SVG,但是打开它时看不到在SVG文件中所做的更改。 当我使用以下命令打印出SVG元素的值之一时 它已更改,但是当我在记事本中打开SVG时是相同的。 SVG 其他更新:解决了 问题答案: 似乎您在这里没有使用任何特定的SVG功能,只是一些常规XML解析。

  • 问题内容: 这可能吗?以下是我尝试过的方法,但它完全用黑色填充了圆圈。 问题答案: SVG元素的图像填充是通过SVG模式实现的。