6

私はPythonrsvgバインディングを使用して、svgイメージをcairoにレンダリングし、ファイルに保存します。これはほとんど機能します。ただし、svgファイルにリンクされた画像が含まれている場合は次のようになります。

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

画像は最終ファイルに表示されません(残りのsvgは問題なくレンダリングされます)。スクリプトが実行されている場所に基づいて相対パスは正しいですが、通常は相対ファイルパスではなく相対URLであるという事実に問題があると思います。これを回避するにはどうすればよいですか?

4

4 に答える 4

17

画像リソースをロードできるようにするためにLibRsvgが満たす必要のある多くの要因があります。v2.40以降、これらには次のものが含まれます。

  • 画像にはxlink:href属性が必要です
  • その属性には、完全で有効なURIが含まれている必要があります
  • スキームはdata://またはfile://
  • file://パスは絶対でなければなりません
  • file://パスは、SVGソースファイルのパス内またはその下にある必要があります(シンボリックリンクが逆参照された後)

rsvg-convert入力がstdinを介して渡される場合、入力ファイルのサブディレクトリとしてカウントされるパスはなく、すべての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ソースにに移動して再コンパイルします。

于 2015-04-14T16:25:32.490 に答える
3

答えは、リンクを最初に処理しfile:///、完全な絶対パスにすることでした。

于 2010-06-08T07:22:03.313 に答える
3

含めているファイルが同じパス上にないか、変換するSVGファイルのパスの下にない場合、ファイルは見つからないようです。これはバグだと思います。

于 2014-06-13T14:44:15.590 に答える
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_handle_allow_loadこのディレクトリの関数を編集して、rsvg-base.c2275行目に次のコードを追加することにより、パスの読み込み制限を回避しました。

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

rsvg_cairo_surface_new_from_hrefまた、関数を編集し、rsvg-image.cmimeタイプを使用してロードを停止する必要がありました。次のように関数を置き換えるだけです。

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とともにインストールされるコマンドラインツールを使用して、相対的なSVGリンクをレンダリングできます。

rsvg-convert test.svg -o test.png

このようにlibrsvgをインストールした後にインストールした場合、ImageMagickを使用して相対画像リンクを持つSVGをPNGファイルに変換することもできました。

convert test.svg test.png

これにより、rsvgの機能とパフォーマンスをテストできます。私のアプリケーションでは、Inkscapeよりも2〜3倍高速であることがわかりました。実稼働環境でこれを使用する場合は、コードをよりインテリジェントに変更することをお勧めします。

于 2016-02-18T03:16:47.317 に答える