rsvg не отображает связанные изображения - PullRequest
6 голосов
/ 03 июня 2010

Я использую привязки python rsvg для рендеринга SVG-изображения в Каир и сохранения в файл, что в основном работает. Но если файл SVG содержит связанное изображение, например:

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

изображение не отображается в конечном файле (остальная часть svg отображается просто отлично). Относительный путь корректен в зависимости от того, где выполняется скрипт, но я предполагаю, что есть некоторая проблема с тем фактом, что обычно это будет относительный URL, а не относительный путь к файлу. Как мне обойти это?

Ответы [ 4 ]

15 голосов
/ 14 апреля 2015

Есть много факторов, которые должны быть удовлетворены для LibRsvg, чтобы разрешить загрузку ресурса изображения. Начиная с v2.40 они включают:

  • изображение должно иметь атрибут xlink:href
  • этот атрибут должен содержать полный действительный URI
  • схема может быть data:// или file://
  • file:// пути должны быть абсолютными
  • file:// пути должны быть в или ниже пути исходного файла SVG (после разыменования любых символических ссылок)

Обратите внимание, что если входные данные передаются в rsvg-convert через стандартный ввод, тогда никакие пути не считаются подкаталогами входного файла, и все 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 в исходном коде и перекомпилируйте.

3 голосов
/ 13 июня 2014

Похоже, что если файл, который вы включаете, находится не по тому же пути или по пути к файлу SVG, который вы хотите преобразовать, он не найдет его. Я считаю это ошибкой.

3 голосов
/ 08 июня 2010

Ответ состоял в том, чтобы обработать ссылки, чтобы начать с file:/// и получить полный абсолютный путь.

2 голосов
/ 18 февраля 2016

Я хотел, чтобы рендеринг изображений 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 к вышеприведенным командам.

Как только это было сделано, я мог рендерить относительные ссылки SVG с помощью инструмента командной строки rsvg-convert, который устанавливается вместе с librsvg:

rsvg-convert test.svg -o test.png

Мне также удалось использовать ImageMagick для преобразования SVG с относительными ссылками на изображения в файлы PNG, если я установил его после установки librsvg следующим образом:

convert test.svg test.png

Это позволит вам протестировать функцию и производительность rsvg - я обнаружил, что это было в 2-3 раза быстрее, чем Inkscape для моего приложения. Я рекомендую изменить код более разумно, если вы используете его в производственной среде.

...