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


person dors    schedule 15.12.2014    source источник
comment
Попробуйте присвоить SVG атрибут viewBox корневому элементу <svg>.   -  person Robert Longson    schedule 15.12.2014
comment
Какая у вас версия ImageMagick? Каков результат convert -version?   -  person Kurt Pfeifle    schedule 15.12.2014


Ответы (1)


Я успешно преобразовал 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):

 Version: ImageMagick 6.9.0-0 Q16 x86_64 2014-12-06 http://www.imagemagick.org
 Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
 Features: DPC Modules
 Delegates (built-in): 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. My ImageMagick использует для этого внешнего делегата. Как именно это работает, можно сделать видимым, добавив параметр -verbose в командную строку:

convert -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-bit sRGB 3.04KB 0.000u 0:00.000
 /var/tmp/magick-124705G1EV-reRRrb PS 155x209 155x209+0+0 16-bit sRGB 3.04KB 0.000u 0:00.000

 letter_a_with_acute.svg=>/var/tmp/magick-124705G1EV-reRRrb PS 155x209 155x209+0+0 16-bit 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-bit sRGB 17c 2.93KB 0.000u 0:00.000

 [ghostscript library] -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/var/tmp/magick-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
person Kurt Pfeifle    schedule 15.12.2014
comment
На сервере, на котором я нахожусь, у меня другая версия с другими делегатами. Поскольку я нахожусь на общем хосте, обновление будет сложным. Спасибо за объяснение. $ convert --version Версия: ImageMagick 6.6.9-7 06.03.2014 Q16 imagemagick.org Авторские права: Copyright (C) ImageMagick Studio LLC, 1999–2011. Особенности: OpenMP. - person dors; 16.12.2014