代码之家  ›  专栏  ›  技术社区  ›  colinmarc

rsvg不呈现链接图像

  •  6
  • colinmarc  · 技术社区  · 16 年前

    我用蟒蛇 rsvg 用于将SVG映像呈现到cairo并保存到文件的绑定,这主要起作用。但是,如果SVG文件包含链接图像,例如:

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

    图像不会显示在最终文件中(SVG的其余部分渲染得很好)。相对路径是正确的,基于脚本运行的位置,但我猜想它通常是相对的URL,而不是相对的文件路径,这是有问题的。我该怎么解决这个问题?

    4 回复  |  直到 10 年前
        1
  •  15
  •   Ian Mackinnon    11 年前

    librsvg必须满足许多因素才能允许加载图像资源。从2.40版开始,包括:

    • 图像必须具有 xlink:href 属性
    • 该属性必须包含完整、有效的URI
    • 方案可以是 data:// file://
    • 文件:/ / 路径必须是绝对路径
    • 文件:/ / 路径必须在SVG源文件的路径之内或之下(在取消引用任何符号链接之后)

    注意,如果输入被传递到 rsvg-convert 通过stdin,那么没有路径可以算作输入文件的子目录 文件:/ / 图像将被拒绝。

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

    控制图像URL分辨率的代码可以在 LibRsvg source 在里面 rsvg-base.c 功能 _rsvg_handle_allow_load .

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

    #define G_ENABLE_DEBUG
    

    config.h 在源中并重新编译。

        2
  •  3
  •   colinmarc    16 年前

    答案是先处理链接 file:/// 做一条完全绝对的道路。

        3
  •  3
  •   reallyniceguy    12 年前

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

        4
  •  2
  •   Luke Stutters    10 年前

    我想让librsvg图像渲染在我的Mac上加速SVG渲染。伊恩·麦金农的伟大回答包含了所有的要素,但是要实现对图书馆的改变是很棘手的。这些步骤使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添加到上述命令中。

    完成后,我可以使用 rsvg-convert 与librsvg一起安装的命令行工具:

    rsvg-convert test.svg -o test.png
    

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

    convert test.svg test.png
    

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