rsvg无法渲染链接的图像。

6

我使用Python的rsvg绑定将SVG图像渲染到cairo并保存到文件中,这在大多数情况下都有效。但是,如果SVG文件包含链接的图像,就像这样:

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

最终文件中图像无法显示(其余svg正常呈现)。相对路径是正确的,基于脚本运行的位置,但我猜测问题在于它通常应该是相对URL而不是相对文件路径。我该如何解决这个问题?


我有同样的问题。放置一个无效的URL href(链接到不存在的文件)会显示rsvg如果找不到文件,则不会输出错误。 - molecular
4个回答

17

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

  • 图像必须具有 xlink:href 属性。
  • 该属性必须包含完整且有效的 URI。
  • 协议可以是 data://file://
  • file:// 路径必须是绝对路径。
  • file:// 路径必须在 SVG 源文件的路径中或其下方(在取消符号链接后)。

请注意,如果通过 stdin 向 rsvg-convert 输入数据,则所有路径都不被视为输入文件的子目录,并且所有 file:// 图像都将被拒绝。

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

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

图片URL分辨率的代码可以在LibRsvg源代码中的rsvg-base.c文件中找到,函数名为_rsvg_handle_allow_load

如果想在图像加载失败时向rsvg-convert添加调试通知,可以追加

#define G_ENABLE_DEBUG

将源代码中的config.h文件进行配置,并重新编译。


1
为了更新此内容,现在规则已经在allowed_url.rs文件中明确说明,该文件可在此处获取:https://gitlab.gnome.org/GNOME/librsvg/blob/master/rsvg_internals/src/allowed_url.rs - Mike Marcacci

4

如果您需要转换的SVG文件路径上没有或不在包含文件的路径下,则似乎无法找到它。我认为这是一个bug。


我猜是一种“安全特性”。我查看了源代码,除非重新编译,否则无法禁用它。请注意,这在Ubuntu 10.04上有效,但在12.04上添加了这个“特性”。 - Gordon Williams

3

我希望在我的Mac上实现librsvg图像渲染,以加快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

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

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

我还需要编辑rsvg-image.c中的rsvg_cairo_surface_new_from_href函数并停止使用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添加到上述命令中。

完成此操作后,我可以使用安装有librsvg的rsvg-convert命令行工具呈现相对SVG链接:

rsvg-convert test.svg -o test.png

如果我在安装librsvg之后按照以下方式安装ImageMagick,我也可以使用ImageMagick将具有相对图像链接的SVG转换为PNG文件:

convert test.svg test.png

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

3
答案是处理链接以file:///开头,并且必须是完整的绝对路径。

1
在编程方面,将以下内容从英语翻译成中文。仅返回翻译后的文本:对我没有帮助:(。它在另一台安装了相同 librsvg 版本的机器上可以工作。但在这台 archlinux 机器上不行。即使我自己编译 rsvg-convert..也没用。 - molecular
相同的问题(使用OSX 10.9) - tobinharris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接