2010-06-02 92 views
5

我使用Python rsvg綁定渲染SVG圖像到開羅,並保存到文件,其中大部分作品。但是,如果SVG文件中包含鏈接的圖像,像這樣:RSVG不會呈現鏈接的圖像

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

圖像不會在最終的文件顯示(SVG的其餘部分呈現就好了)。根據腳本的運行位置,相對路徑是正確的,但我猜測它的一個問題是它通常是一個相對URL,而不是一個相對的文件路徑。我如何解決這個問題?

+0

我有同樣的問題。把一個無效的url href(鏈接到一個不存在的文件)顯示rsvg如果找不到文件就不會輸出錯誤。 – molecular 2013-10-30 10:49:08

回答

2

答案是處理環節入手file:///,是一個完整的絕對路徑。

+1

對我沒有幫助:(。它可以在另一臺機器上使用相同的librsvg版本,但不是在這個archlinux機器上,即使編譯的rsvg-convert自己也沒有幫助 – molecular 2013-10-30 10:47:13

+0

同樣的問題(使用OSX 10.9) – tobinharris 2014-05-17 11:08:42

2

看來,如果要包括的文件是不一樣的路徑上,或者你要轉換的SVG文件的路徑下,也不會發現它。 我認爲這是一個錯誤。

+0

我猜我有一個'安全特性',我看了看源代碼,沒有辦法在重新編譯之後禁用它,只是注意到這個在Ubuntu 10.04上有效,但是在12.04這個'特性'被添加了。 – 2014-10-15 12:21:36

11

有許多因素必須滿足librsvg中允許加載圖像資源。作爲V2.40這些包括:

  • 圖像必須具有xlink:href屬性
  • 該屬性必須包含一個完整的,有效的URI
  • 的方案可以是data://file://
  • file://路徑必須是絕對
  • file://路徑必須在或SVG源文件的路徑(任何符號鏈接已被解除引用之後)
0123下面

注意,如果輸入的是通過標準輸入傳遞給rsvg-convert,那麼沒有路徑計算作爲輸入文件的子目錄和所有file://圖像將被拒絕。

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

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

代碼管理圖像的URL解析可以在LibRsvg sourcersvg-base.c發現,功能_rsvg_handle_allow_load

要添加調試通知RSVG變頻時圖像加載失敗後,可以向其中追加

#define G_ENABLE_DEBUG 

config.h在源和重新編譯。

2

我希望得到的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-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 

根據您的系統,您可能需要須藤添加到上面的命令。

一旦這樣做,我可以渲染使用安裝用的librsvg的rsvg-convert命令行工具相對SVG鏈接:

rsvg-convert test.svg -o test.png 

我也能使用的ImageMagick來SVGs轉換相對於圖像鏈接到PNG如果我以這種方式安裝的librsvg,安裝完成後文件:

convert test.svg test.png 

這將讓你測試RSVG功能和性能 - 我發現這是比2-3倍快Inkscape的我的應用程序。如果您在生產環境中使用此代碼,我建議您更智能地更改代碼。