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

时间:2014-12-15 05:41:08

标签: php svg imagemagick imagemagick-convert

我有一个类似于

的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"高度="25厘米"在XML文件中,然后角落中的完整角色为具有大背景的小图像,填充图像的其余部分。我在Stackexchange和各种论坛中搜索过但无法找到解决方案。

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

我认为这是检测SVG图像的正确大小的问题。但是,不能想到一个简单的方法来做到这一点。

1 个答案:

答案 0 :(得分:2)

我使用此命令成功地从您的链接转换了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, generated from 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的繁重工作。我的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的尺寸。

  4. 换句话说,如果您无法正确设置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