【问题标题】:rsvg doesn't render linked imagesrsvg 不呈现链接图像
【发布时间】:2011-02-27 01:04:50
【问题描述】:

我使用 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 找不到该文件,它不会输出错误。

标签: svg librsvg


【解决方案1】:

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解析的代码可以在rsvg-base.c中的LibRsvg source中找到,函数_rsvg_handle_allow_load

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

#define G_ENABLE_DEBUG

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 对我没有帮助:(。它可以在另一台具有相同 librsvg 版本的机器上运行。但在这台 archlinux 机器上却不行。即使我自己编译了 rsvg-convert .. 也没有帮助。跨度>
  • 同样的问题(使用 OSX 10.9)
【解决方案3】:

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

【讨论】:

  • 我猜是“安全功能”。我查看了源代码,除非重新编译,否则无法禁用它。请注意,这适用于 Ubuntu 10.04,但在 12.04 上添加了此“功能”。
【解决方案4】:

我想让 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

我编辑了这个目录中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 将带有相关图像链接的 SVG 转换为 PNG 文件:

convert test.svg test.png

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多