【问题标题】:ImageMagick convert SVG to PNG not working with RSVG enabledImageMagick 将 SVG 转换为 PNG 不能在启用 RSVG 的情况下工作
【发布时间】:2025-12-04 13:10:01
【问题描述】:

我正在使用 ImageMagick 的 convert 实用程序将 SVG 文件转换为 PNG 图像。起初,我在 OSX (brew install imagemagick) 上使用 IM 的香草安装来转换 SVG,使用:

$ convert file.svg file.png

除了该文件中的一些图像对象被偏移(到图像的实际链接)之外,这有效。然后我 read a related question 建议使用 rsvg 支持编译 ImageMagick(自制软件使用 brew install imagemagick --use-rsvg)。

现在,当我尝试执行转换时,没有呈现图像。我尝试使用this SVG file,结果 PNG 是空白的。但是,如果 SVG 上存在任何文本,则会将其呈现在正确的位置。任何想法如何进行?谢谢。

【问题讨论】:

  • 试试 Inkscape。如果你将它安装在你的系统上,Imagemagick 将自动通过 RSVG 或 MSVG 使用它。

标签: svg imagemagick png rsvg


【解决方案1】:

我遇到了类似的问题,只是被告知安装inkscape,它可以工作,

ImageMagick converts svg graph into pdf with tilted x-axis labels, any ideas?

委托列表没有改变,但输出改变了。在进一步摆弄强制 MSVG 时,我无法解决问题。所以另一个代表可能是最好的解决方案。

【讨论】:

    【解决方案2】:

    您应该运行此命令以查看您的 ImageMagick 尝试使用的所有“代表”的列表:

     convert -list delegate
    

    要发现 ImageMagick 用于 SVG 处理的委托命令,请运行

     convert -list delegate | grep 'svg ='
    

    您应该会看到convert 尝试使用的二进制 + 命令行参数。我的情况是 /opt/local/bin/rsvg-convert(但我没有使用 Homebrew,我使用 MacPorts)。

    现在检查系统上是否存在二进制文件:

    • 如果是,直接运行并从那里调试。
    • 如果没有,请尝试查找 Homebrew 安装的位置,并更改 ImageMagick 的代理配置文件。它被称为 delegates.xml。 MacPorts 将其放入/opt/local/etc/ImageMagick/delegates.xml——我不知道 Homebrew 将其存储在哪里。

    但是,由于您的未修改安装已经在工作,因此一定当时已经有一个 SVG 消费委托在工作。否则您根本不会处理任何 SVG

    ImageMagick 的这种内部 SVG 渲染方法称为 MSVG。这远不是一个功能完整的 SVG 解释器/渲染器。


    更新:

    要查看 ImageMagick 对哪种格式执行的操作,请运行以下命令:

    convert -list format
    

    对于 SVG 运行

    convert -list format | grep SVG
    

    我的系统上的输出是:

     MSVG  SVG       rw+   ImageMagick's own SVG internal renderer
      SVG  SVG       rw+   Scalable Vector Graphics (RSVG 2.36.1)
     SVGZ  SVG       rw+   Compressed Scalable Vector Graphics (RSVG 2.36.1)
    

    安装rsvg 后,渲染 SVG 的内部方法不会消失。您仍然可以通过在命令行中添加 MSVG: 来强制 ImageMagick 使用内部渲染器,如下所示:

    convert  MSVG:file.svg  file.png
    

    为了完整起见...

    【讨论】:

    • 我也有/usr/local/bin/rsvg-convert,具体来说:$ convert -list delegate | grep`cdr => "uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o"` ` svg => "rsvg-convert" -o "%o" "%i"`
    • 您的/usr/local/bin/rsvg-convert 设置了可执行位吗?它是否可以在命令行上使用给定的命令,即:/usr/local/bin/rsvg-convert -o out.png in.svg
    • 再次感谢您跟进此事。在运行convert -list format | grep SVG 时,我的输出与您完全相同,而在运行convert MSVG:file.svg file.png 时,我确实得到了带有图像的输出,尽管它们有些偏移(这是我最初的问题)。 rsvg-convert,符号链接到/usr/local/Cellar/librsvg/2.36.1/bin/rsvg-convert,有755个权限。
    【解决方案3】:

    哦,我现在查看了您链接到的the SVG file

    它包含 JavaScript。我认为 RSVGlib 不支持 SVG 中的 JavaScript。我确信名为 MSVG 的内部 SVG 编码器没有。

    【讨论】:

    • 感谢您的帮助。我还在仅包含图像和文本的文件上进行了尝试。
    最近更新 更多