【问题标题】:Image cropped while converting from SVG to PNG using ImageMagick使用 ImageMagick 从 SVG 转换为 PNG 时裁剪的图像
【发布时间】:2015-02-13 04:39:21
【问题描述】:

我有一个类似于

的 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 进行以下操作。但它仍在生成裁剪后的图像。

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

【问题讨论】:

  • 尝试在根 <svg> 元素上为 SVG 赋予 viewBox 属性。
  • 您的 ImageMagick 版本是什么? convert -version 的输出是什么?

标签: php svg imagemagick imagemagick-convert


【解决方案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

这是结果,我觉得还可以:

我的 ImageMagick 版本是(根据convert -version):

版本:ImageMagick 6.9.0-0 Q16 x86_64 2014-12-06 http://www.imagemagick.org 版权所有:版权所有 (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/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

【讨论】:

  • 在我所在的服务器上,我有不同的版本和不同的代表。由于我在共享主机上,因此升级会很棘手。感谢您的解释。 $ convert --version 版本:ImageMagick 6.6.9-7 2014-03-06 Q16 imagemagick.org 版权所有:版权所有 (C) 1999-2011 ImageMagick Studio LLC 功能:OpenMP
猜你喜欢
  • 2013-12-20
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2012-12-12
  • 2015-05-28
  • 2012-04-08
  • 2012-05-19
相关资源
最近更新 更多