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, я не мог заставить проблему уйти. Поэтому другой делегат, вероятно, является лучшим решением.