rsvg不呈现链接的图像

时间:2010-06-02 21:11:16

标签: svg librsvg

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

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

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

4 个答案:

答案 0 :(得分:15)

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

管理图片网址解析的代码可以在rsvg-base.c _rsvg_handle_allow_load中找到,功能#define G_ENABLE_DEBUG

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

config.h

到源代码中的{{1}}并重新编译。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我想在我的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_handle_allow_load中的rsvg-base.c函数,通过在第2275行附近添加此代码来绕过路径加载限制:

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。

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

rsvg-convert test.svg -o test.png

如果我以这种方式安装librsvg之后安装了它,我还可以使用ImageMagick将SVG与相对图像链接转换为PNG文件:

convert test.svg test.png

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