我使用python rsvg
绑定将svg图像渲染到cairo并保存到文件,这主要起作用。但是如果svg文件包含链接图像,如下所示:
<image href="static/usrimgs/tmpDtIKpx.png" x="10" y="10" width="600px" height="400px"></image>
图像没有显示在最终文件中(svg的其余部分渲染得很好)。根据脚本运行的位置,相对路径是正确的,但我猜测它通常是相对URL而不是相对文件路径这一事实存在一些问题。我该如何解决这个问题?
答案 0 :(得分:15)
LibRsvg必须满足许多因素才能加载图像资源。从v2.40开始,这些包括:
xlink:href
属性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正确地渲染了具有相对路径的链接图像。我希望能节省一些时间。
首先,我使用:
安装了librsvgbrew 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倍。如果您在生产环境中使用它,我建议您更智能地更改代码。