2010-06-02 1 views
5

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

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

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

+0

У меня такая же проблема. Ввод неверного url href (ссылка на файл, который не существует) показывает, что rsvg не выводит ошибку, если он не может найти файл. – molecular

ответ

2

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

+1

не помог мне :(Он работает на другой машине с той же версией librsvg, но не на этой машине archlinux. Даже скомпилированный rsvg-convert сам .. не помогло. – molecular

+0

Такая же проблема (с использованием OSX 10.9) – tobinharris

2

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

+0

Я думаю, что это «функция безопасности». Я посмотрел на источник, и нет возможности отключить его от перекомпиляции. Просто отметим, что это работало на Ubuntu 10.04, но в 12.04 эта функция была добавлена. –

11

Для 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 source в rsvg-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_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 для преобразования SVGs с относительными ссылками на изображения в формат PNG файлы, если я установил его после установки librsvg таким образом:

convert test.svg test.png 

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