2010-06-02 43 views
5

Tôi sử dụng liên kết trăn rsvg để hiển thị hình ảnh svg thành cairo và lưu vào tệp, chủ yếu hoạt động. Nhưng nếu tệp svg chứa hình ảnh được liên kết, như vậy:rsvg không hiển thị hình ảnh được liên kết

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

hình ảnh không hiển thị trong tệp cuối cùng (phần còn lại của svg chỉ hiển thị tốt). Đường dẫn tương đối là chính xác dựa trên nơi tập lệnh đang chạy, nhưng tôi đoán có một số vấn đề với thực tế rằng nó thường sẽ là một URL tương đối, không phải là một tệp tương đối. Làm thế nào để tôi có được điều này?

+0

Tôi có cùng một vấn đề. Đặt một url không hợp lệ (liên kết đến một tệp không tồn tại) cho thấy rsvg sẽ không xuất ra lỗi nếu nó không thể tìm thấy tệp. – molecular

Trả lời

2

Câu trả lời là xử lý các liên kết để bắt đầu với file:/// và là đường dẫn tuyệt đối đầy đủ.

+1

không giúp ích gì cho tôi: (Nó hoạt động trên một máy khác có cùng phiên bản librsvg. Không phải trên máy archlinux này. Mặc dù đã biên dịch rsvg-convert bản thân mình .. không giúp được gì. – molecular

+0

Vấn đề tương tự (sử dụng OSX 10.9) – tobinharris

2

Dường như, nếu tệp bạn đang đưa vào không nằm trên cùng một đường dẫn hoặc dưới đường dẫn của tệp SVG bạn muốn chuyển đổi, nó sẽ không tìm thấy tệp đó. Tôi coi đây là lỗi.

+0

Một tính năng bảo mật 'Tôi đoán. Tôi nhìn vào nguồn và không có cách nào để vô hiệu hóa nó ngắn của một biên dịch lại. Chỉ cần một lưu ý rằng điều này làm việc trên Ubuntu 10.04, nhưng trên 12.04' tính năng 'này đã được thêm vào. –

11

Có nhiều yếu tố phải được đáp ứng cho LibRsvg để cho phép tải tài nguyên hình ảnh. Tính đến v2.40 này bao gồm:

  • hình ảnh phải có một thuộc tính xlink:href
  • rằng thuộc tính phải chứa đầy đủ, hợp lệ URI
  • chương trình này có thể data:// hoặc file://
  • file:// đường phải tuyệt đối
  • file:// đường dẫn phải nằm trong hoặc bên dưới đường dẫn của tệp nguồn SVG (sau khi bất kỳ liên kết tượng trưng nào bị hủy tham chiếu)

Lưu ý rằng nếu đầu vào được chuyển đến rsvg-convert qua stdin, thì không có đường dẫn nào được tính là thư mục phụ của tệp đầu vào và tất cả hình ảnh file:// sẽ bị từ chối.

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

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

Mã quản lý hình ảnh độ phân giải URL có thể được tìm thấy trong các LibRsvg source trong rsvg-base.c, chức năng _rsvg_handle_allow_load.

Để thêm một thông báo gỡ lỗi để rsvg-chuyển đổi khi tải ảnh thất bại, người ta có thể nối thêm

#define G_ENABLE_DEBUG 

để config.h trong nguồn và biên dịch lại.

2

Tôi muốn hiển thị hình ảnh librsvg hoạt động trên máy Mac để tăng tốc độ hiển thị SVG. Câu trả lời tuyệt vời của Ian Mackinnon có tất cả các thành phần nhưng việc thực hiện thay đổi đối với thư viện là khó khăn. Các bước này đã làm cho librsvg hiển thị chính xác các hình ảnh được liên kết với các đường dẫn tương đối. Tôi hy vọng điều này giúp tiết kiệm thời gian.

Trước tiên, tôi cài đặt librsvg sử dụng:

brew install --build-from-source librsvg 

Tại thời điểm viết bài, điều này cài đặt phiên bản 2.40.13 và các thư viện cần thiết để xây dựng nó.sau đó tôi đã tải về và giải nén tập tin nguồn vào thư mục chính của tôi:

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 

Tôi chỉnh sửa các _rsvg_handle_allow_load chức năng trong rsvg-base.c trong thư mục này để vượt qua những hạn chế con đường tải bằng cách thêm mã này xung quanh dòng 2275:

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

Tôi cũng cần chỉnh sửa hàm rsvg_cairo_surface_new_from_href trong rsvg-image.c và dừng tải bằng các loại mime - chỉ cần thay thế chức năng như sau:

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  } 

tôi cần phải sử dụng các lệnh này sửa đổi một chút để biên dịch và cài đặt các thư viện chỉnh sửa:

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 

Tùy thuộc vào hệ thống của bạn, bạn có thể cần phải thêm sudo để các lệnh trên.

Một khi điều này đã được thực hiện, tôi có thể làm cho các liên kết SVG tương đối bằng cách sử dụng công cụ dòng rsvg-convert lệnh được cài đặt với librsvg:

rsvg-convert test.svg -o test.png 

Tôi cũng đã có thể sử dụng ImageMagick để chuyển đổi SVGs với các liên kết hình ảnh liên quan đến PNG file nếu tôi cài đặt nó sau khi cài đặt librsvg theo cách này:

convert test.svg test.png 

này sẽ cho phép bạn kiểm tra rsvg chức năng và hiệu suất - tôi thấy đó là 2-3x nhanh hơn so với Inkscape cho ứng dụng của tôi. Tôi khuyên bạn nên thay đổi mã thông minh hơn nếu bạn sử dụng mã này trong môi trường sản xuất.

Các vấn đề liên quan