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
标签:php,svg,imagemagick,imagemagick-convert 来源: https://codeday.me/bug/20190703/1362165.html