У меня есть файл SVG, похожий на
http://www.fileformat.info/info/unicode/char/00c1/latin_capital_letter_a_with_acute.svg
Когда я использую ImageMagick, чтобы преобразовать его в PNG, вот так:
convert latin_capital_letter_a_with_acute.svg tmp.png
тогда видна только верхняя часть символа.
Файл SVG не определяет высоту и ширину. Если я вручную укажу width = «25cm» height = «25cm» в XML-файле, тогда полный символ в углу будет маленьким изображением с большим фоном, заполняющим остальную часть изображения. Я искал в Stackexchange и на различных форумах, но не смог найти решение для этого.
Я попробовал следующее с помощью PHP. Но это все еще производит обрезанное изображение.
Я думаю, что это проблема с определением правильного размера изображения SVG. Но не могу придумать простой способ сделать это.
Я успешно преобразовал SVG из вашей ссылки с помощью этой команды:
convert \
http://www.fileformat.info/info/unicode/char/00c1/latin_capital_letter_a_with_acute.svg \
latin_capital_letter_a_with_acute.png
Вот результат, который выглядит хорошо для меня:
Моя версия ImageMagick есть (в соответствии с convert -version
):
Версия: ImageMagick 6.9.0-0 Q16 x86_64 2014-12-06 http://www.imagemagick.org Авторское право: Copyright (C) 1999-2014 ImageMagick Studio LLC Особенности: DPC Модули Делегаты (встроенные): bzlib cairo djvu fftw fontconfig freetype gslib gvc \ jbig jng jp2 jpeg lcms lqr ltdl lzma openexr \ pangocairo png ps rsvg tiff webp wmf x xml zlib
Однако, не ImageMagick напрямую и сам по себе делает тяжелую работу по интерпретации SVG. Мой ImageMagick использует внешнего делегата для достижения этой цели. Как именно это работает, можно сделать видимым, добавив -verbose
установка в командной строке:
конвертировать -verbose letter_a_with_acute.svg letter_a_with_acute.png "/ opt / local / bin / inkscape" "/ var / tmp / magick-12470O5QRRVap0Ub4" \ --export-eps = "/ var / tmp / magick-124705G1EV-reRRrb" --export-dpi = "90,90" \ --export-background = "rgb (100%, 100%, 100%)" --export-background-opacity = "1" \ > "/ var / tmp / magick-12470W9feuKm0JHUA" 2> 1 / var / tmp / magick-12470qEPdaNM3mKYw1 PNG 155x209 155x209 + 0 + 0 8-битный sRGB 3.04KB 0.000u 0: 00.000 / var / tmp / magick-124705G1EV-reRRrb PS 155x209 155x209 + 0 + 0 16-битный sRGB 3.04KB 0.000u 0: 00.000 letter_a_with_acute.svg => / var / tmp / magick-124705G1EV-reRRrb PS 155x209 155x209 + 0 + 0 16-битный sRGB 3.04KB 0.000u 0: 00.000 letter_a_with_acute.svg => latin_capital_letter_a_with_acute.png PS 155x209 155x209 + 0 + 0 8-битный sRGB 17c 2.93KB 0.000u 0: 00.000 [библиотека ghostscript] -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT \ -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2 \ "-sDEVICE = pngalpha" -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 \ "-r72x72" -g155x209 "-sOutputFile = / var / tmp / magick-12470qEPdaNM3mKYw% d" \ "-f / var / tmp / magick-12470Xt3b3Qubkxx2" \ "-F / вар / TMP / Магик-12470VRcUz0MbmdiC"
Как вы можете ясно видеть, convert
использует два делегата в двух разных шагах, чтобы осуществить преобразование:
Во-первых, он запускает inkscape
команда. Эта команда экспортирует SVG в EPS.
Во-вторых, он запускает команду Ghostscript. Эта команда преобразует EPS из шага 1 в окончательный PNG.
В промежутке между двумя вышеуказанными шагами запускается какая-то другая команда, возможно, identify
, чтобы узнать размеры EPS, который был произведен.
Другими словами, если вы не можете настроить свой ImageMagick делегаты правильно, чтобы они обрабатывали SVG-файлы для вас, вы всегда можете использовать Inkscape непосредственно в командной строке для создания PNG:
inkscape \
--without-gui \
--export-png=out.png \
--export-dpi="90,90" \
--export-background="rgb(100%,100%,100%)" \
--export-background-opacity="1" \
input.svg
Смотря на результат, out.png
кажется, что он использует слишком много пустого пространства вокруг буквы:
identify out.png
out.png PNG 744x1052 744x1052+0+0 8-bit sRGB 13.1KB 0.000u 0:00.000
Это может быть исправлено ImageMagick:
convert out.png -trim +repage trimmed.png
Проверьте:
identify trimmed.png
trimmed.png PNG 193x260 193x260+0+0 8-bit sRGB 256c 3.53KB 0.000u 0:00.000
Других решений пока нет …