6

我使用 pythonrsvg绑定将 svg 图像渲染到 cairo 并保存到文件,这主要是有效的。但如果 svg 文件包含链接图像,如下所示:

<image href="static/usrimgs/tmpDtIKpx.png" x="10" y="10" width="600px" height="400px"></image>

图像没有显示在最终文件中(其余的 svg 渲染得很好)。根据脚本运行的位置,相对路径是正确的,但我猜它通常是相对 URL,而不是相对文件路径这一事实存在一些问题。我该如何解决这个问题?

4

4 回答 4

17

LibRsvg 必须满足许多因素才能允许加载图像资源。从 v2.40 开始,这些包括:

  • 图片必须有一个xlink:href属性
  • 该属性必须包含完整、有效的 URI
  • 该计划可以是data://file://
  • file://路径必须是绝对的
  • file://路径必须位于或低于 SVG 源文件的路径(在取消引用任何符号链接之后)

请注意,如果输入是rsvg-convert通过 stdin 传递的,则没有路径算作输入文件的子目录,并且所有file://图像都将被拒绝。

rsvg-convert < input.svg > output.png  # images denied

rsvg-convert -o output.png input.svg  # images allowed

可以在函数中的LibRsvg 源代码中找到管理图像 URL 解析的代码。rsvg-base.c_rsvg_handle_allow_load

要在图像加载失败时向 rsvg-convert 添加调试通知,可以附加

#define G_ENABLE_DEBUG

config.h源代码中并重新编译。

于 2015-04-14T16:25:32.490 回答
3

看来,如果您包含的文件不在同一路径上或不在您要转换的 SVG 文件的路径下,它将找不到它。我认为这是一个错误。

于 2014-06-13T14:44:15.590 回答
3

答案是处理链接以开始file:///并成为完整的绝对路径。

于 2010-06-08T07:22:03.313 回答
3

我想让 librsvg 图像渲染在我的 Mac 上工作,以加快 SVG 渲染。Ian Mackinnon 的出色答案包含所有要素,但对库进行更改却很棘手。这些步骤使 librsvg 正确渲染具有相对路径的链接图像。我希望这可以节省一些时间。

首先,我使用以下方法安装了 librsvg:

brew install --build-from-source librsvg

在撰写本文时,这会安装 2.40.13 版本和构建它所需的库。然后我将源存档下载并解压缩到我的主目录中:

wget https://download.gnome.org/sources/librsvg/2.40/librsvg-2.40.13.tar.xz
tar jxvf librsvg-2.40.13.tar.xz
cd librsvg-2.40.13

我通过在第 2275 行添加以下代码来编辑此目录中的_rsvg_handle_allow_load函数rsvg-base.c以绕过路径加载限制:

2275
2276     goto allow; // Just try and load it!
2277     

我还需要编辑rsvg_cairo_surface_new_from_href函数rsvg-image.c并使用 mime 类型停止加载 - 只需像这样替换函数:

55     if (mime_type) {
56         // loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error);     // This doesn't work on my mac
57         loader = gdk_pixbuf_loader_new (); // This works
58     } else {
59         loader = gdk_pixbuf_loader_new ();
60     }

我需要使用这些稍加修改的命令来编译和安装修改后的库:

make clean
make install gdk_pixbuf_binarydir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders gdk_pixbuf_moduledir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders

根据您的系统,您可能需要将 sudo 添加到上述命令。

rsvg-convert完成此操作后,我可以使用与 librsvg 一起安装的命令行工具渲染相关 SVG 链接:

rsvg-convert test.svg -o test.png

如果我在以这种方式安装 librsvg 后安装它,我还可以使用 ImageMagick 将带有相关图像链接的 SVG 转换为 PNG 文件:

convert test.svg test.png

这将让您测试 rsvg 功能和性能 - 我发现它比我的应用程序的 Inkscape 快 2-3 倍。如果您在生产环境中使用它,我建议您更智能地更改代码。

于 2016-02-18T03:16:47.317 回答