Изображение обрезается при конвертации из SVG в PNG с использованием ImageMagick

У меня есть файл 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. Но не могу придумать простой способ сделать это.

4

Решение

Я успешно преобразовал SVG из вашей ссылки с помощью этой команды:

convert    \
http://www.fileformat.info/info/unicode/char/00c1/latin_capital_letter_a_with_acute.svg \
latin_capital_letter_a_with_acute.png

Вот результат, который выглядит хорошо для меня:

PNG, созданный из SVG

Моя версия 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 использует два делегата в двух разных шагах, чтобы осуществить преобразование:

  1. Во-первых, он запускает inkscape команда. Эта команда экспортирует SVG в EPS.

  2. Во-вторых, он запускает команду Ghostscript. Эта команда преобразует EPS из шага 1 в окончательный PNG.

  3. В промежутке между двумя вышеуказанными шагами запускается какая-то другая команда, возможно, 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]