ImageMagick конвертирует SVG в PNG, не работает с включенным RSVG

Я использую ImageMagick's convert Утилита для конвертирования файла SVG в изображение PNG. Сначала я использовал ванильную установку IM на OSX (brew install imagemagick) конвертировать SVG используя:

$ convert file.svg file.png

Это работало за исключением того, что некоторые объекты изображения в этом файле были смещены (фактические ссылки на изображения). Затем я прочитал соответствующий вопрос, который предлагал компилировать ImageMagick с поддержкой rsvg (homebrew делает это с brew install imagemagick --use-rsvg).

Теперь, когда я пытаюсь выполнить преобразование, изображения не отображаются. Я попытался использовать этот файл SVG, и полученный PNG был пустым. Однако, если какой-либо текст существует в SVG, он отображается в правильном месте. Есть идеи, как поступить? Благодарю.

2 ответа

Решение

О, теперь я посмотрел файл SVG, на который вы ссылались.

Содержит JavaScript. Я не думаю, что RSVGlib поддерживает JavaScript внутри SVG. Я точно знаю, что внутренний SVG-кодер MSVG этого не делает.

Вы должны запустить эту команду, чтобы увидеть список всех "делегатов", которые ваш ImageMagick пытается использовать:

 convert -list delegate

Чтобы узнать, какую команду делегата ImageMagick использует для обработки SVG, запустите

 convert -list delegate | grep 'svg ='

Вы должны увидеть бинарные + параметры командной строки вашего convert пытается использовать. Я в моем случае это /opt/local/bin/rsvg-convert (но я не использую Home brew, я использую MacPorts).

Теперь проверьте, присутствует ли бинарный файл в вашей системе:

  • Если да, запустите его напрямую и отладьте оттуда.
  • Если нет, попробуйте найти, где ваша установка Home brew установила его, и измените файл конфигурации ImageMagick для его делегатов. Это называется Delegates.xml. MacPorts помещает его в /opt/local/etc/ImageMagick/delegates.xml - Я не знаю, где его хранит Home brew.

Однако, поскольку ваша немодифицированная установка уже работала, уже должен был быть делегат, потребляющий SVG, уже тогда. В противном случае вы бы вообще не обрабатывали SVG.

Этот внутренний метод рендеринга SVG ImageMagick называется MSVG. Это далеко не полнофункциональный интерпретатор / рендеринг SVG.


Обновить:

Чтобы увидеть, что ImageMagick делает для какого формата, выполните следующую команду:

convert -list format

и для SVG беги

convert -list format | grep SVG

Вывод в моей системе:

 MSVG  SVG       rw+   ImageMagick's own SVG internal renderer
  SVG  SVG       rw+   Scalable Vector Graphics (RSVG 2.36.1)
 SVGZ  SVG       rw+   Compressed Scalable Vector Graphics (RSVG 2.36.1)

После того, как вы установили rsvg внутренний метод рендеринга SVG не исчезнет. Вы все еще можете заставить ImageMagick использовать внутренний рендер, добавив MSVG: в командной строке, как это:

convert  MSVG:file.svg  file.png

Просто ради полноты...

У меня была похожая проблема, и мне просто сказали установить inkscape, и она работает,

ImageMagick конвертирует svg-график в pdf с наклонными метками оси x, есть идеи?

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

Другие вопросы по тегам