php – 使用ImageMagick从SVG转换为PNG时裁剪图像

我有一个类似的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文件未指定任何高度和宽度.如果我在XML文件中手动指定width =“25cm”height =“25cm”,则角落中的完整字符将为具有大背景的小图像填充图像的其余部分.我在Stackexchange和各种论坛中搜索过但无法找到解决方案.

我也尝试过使用PHP.但它仍然产生裁剪的图像.

> how to resize an SVG with Imagick/ImageMagick

我认为这是检测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):

 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的繁重工作.我的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"

正如您可以清楚地看到的,转换在两个不同的步骤中使用两个代表来实现转换:

>首先,它运行inkscape命令.此命令将SVG导出到EPS.
>其次,它运行Ghostscript命令.此命令将EPS从步骤1转换为最终的PNG.
>在上述两个步骤之间,它运行一些其他命令,可能是识别,以便找出生成的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
点赞