如何用Image Magick将SVG转换为PNG?

kay*_*ahr 358 svg png imagemagick

我有一个SVG文件,其定义大小为16x16.当我使用Image Magick的转换程序将其转换为PNG时,我得到一个16x16像素的PNG,这太小了:

convert test.svg test.png
Run Code Online (Sandbox Code Playgroud)

我需要指定输出PNG的像素大小.-size参数似乎被忽略,-scale参数在转换为PNG 缩放PNG.到目前为止,我通过使用-density参数得到了最好的结果:

convert -density 1200 test.svg test.png
Run Code Online (Sandbox Code Playgroud)

但是我不满意,因为我想要以像素为单位指定输出大小而不用数学来计算密度值.所以我想做这样的事情:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Run Code Online (Sandbox Code Playgroud)

那么我在这里使用的神奇参数是什么?

808*_*und 454

在这个例子中,我无法从ImageMagick中获得好的结果,但是Inkscape在Linux和Windows上做得很好:

inkscape -z -e test.png -w 1024 -h 1024 test.svg
Run Code Online (Sandbox Code Playgroud)

以下是使用此命令将16x16 SVG缩放为200x200 PNG的结果:

在此输入图像描述

在此输入图像描述

仅供参考,我的Inkscape版本(在Ubuntu 12.04上)是:

Inkscape 0.48.3.1 r9886 (Mar 29 2012)
Run Code Online (Sandbox Code Playgroud)

在Windows 7上,它是:

Inkscape 0.48.4 r9939 (Dec 17 2012)
Run Code Online (Sandbox Code Playgroud)

  • 就imagemagick而言,+1是+1.SVG引擎似乎有问题.在大多数情况下,我无法获得准确的结果.Inkscape,OTOH,完美无缺. (15认同)
  • 我认为Inkscape是继Linux之后最令人印象深刻的OSS示例.谢谢你的提示! (13认同)
  • 在OSX上,为X11安装了Inkscape,它适用于我:`/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg` (12认同)
  • @Rörd要使用ImageMagick保持背景透明,请使用`-background none`命令行选项. (11认同)
  • 在OSX上也能很好地工作. (8认同)
  • @DenilsonSá:如果只指定宽度或高度,Inkscape将保持纵横比. (3认同)
  • 您可以使用-d 1200来设置DPI. (2认同)
  • 使用bash和Inkscape批量转换为一行:如果要将目录中的所有svg文件转换为特定大小(30x30),请执行以下操作:`for * .svg; 做inkscape -z -e“ $ {file / .svg / .png}” -w 30 -h 30 $ file; 完成` (2认同)
  • 仅需添加注释:您可以在宽度和高度之间仅使用一个参数,另一个参数将自动缩放。例如,您可能只使用-w 1024,而-h将自动缩放。 (2认同)
  • 我刚刚为 Ubuntu 安装了 Inkscape 1.0.1,它有一个“-o”选项作为“export-filename”的替代选项。还没有检查过 Mac,但我想它是相同的,从而避免了操作系统的差异。 (2认同)

Ali*_*iba 128

试试svgexport:

svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024
Run Code Online (Sandbox Code Playgroud)

svgexport是一个简单的跨平台命令行工具,我将svg文件导出到jpg和png,请参阅此处了解更多选项.要安装svgexport install npm,请运行:

npm install svgexport -g
Run Code Online (Sandbox Code Playgroud)

编辑:如果您发现库有问题,请在GitHub上提交,谢谢!

  • svgexport质量真的那么高.现在它已成为我最喜欢的工具,谢谢shakiba!:) (5认同)
  • svgexport对我很有用.输出与浏览器渲染相比,比ImageMagick更紧密. (4认同)
  • 效果很好,但产生了巨大的形象.使用optipng,我能够将我的文本标识从3兆字节压缩到~20kB. (4认同)
  • evgexport根据大小创建巨大的png文件。推荐svg2png,它也使用PhantomJS进行导出,但是创建的图像要小得多。 (2认同)

Har*_*dev 104

这不是完美的,但它可以完成这项工作.

convert -density 1200 -resize 200x200 source.svg target.png
Run Code Online (Sandbox Code Playgroud)

基本上它可以将DPI提高到足够高的水平(只需使用经过教育/安全的猜测),即调整大小的质量足够高.我试图找到一个合适的解决方案,但经过一段时间后,我认为这对我目前的需求已经足够了.

注意:使用200x200!强制给定的分辨率

  • @jiyinyiyong要使用ImageMagick保持背景透明,请使用`-background none`命令行选项.为了保持图像比例,您还可以仅指定一个尺寸,如宽度为`-resize 200`,高度为`-resize x200`.有关详尽的_ImageMagick geometry_选项,请参阅:http://www.imagemagick.org/script/command-line-processing.php#geometry. (17认同)
  • 在我的情况下失去了不透明度和阴影. (4认同)
  • 我没有复杂的svg,所以这对我有用.`-resize 200%`不起作用,我必须以像素为单位指定大小. (2认同)

Jos*_*ban 54

如果您使用的是MacOS X并且在使用Imagemagick转换时遇到问题,可以尝试使用RSVG lib重新安装它.使用HomeBrew:

brew remove imagemagick
brew install imagemagick --with-librsvg
Run Code Online (Sandbox Code Playgroud)

验证它是否正确委派:

$ convert -version
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-12-17 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib cairo fontconfig freetype jng jpeg lcms ltdl lzma png rsvg tiff xml zlib
Run Code Online (Sandbox Code Playgroud)

它应该显示rsvg.

  • 在莫哈韦沙漠上,我得到`无效的选择:--with-librsvg` (4认同)
  • @zaitsman 可能为时已晚,但是...参数选项已更改,请尝试使用“--with-rsvg”。我认为它需要安装“librsvg2-bin”包。请参阅https://gist.github.com/maxivak/1476f7e979879da9f75371a86d5627b5 (4认同)

小智 36

当svg单位不是px(例如cm)时,Inkscape似乎不起作用.我得到一张空白图片.也许,它可以通过调整dpi来修复,但它太麻烦了.

Svgexport是一个node.js程序,因此通常没用.

Imagemagick的转换工作正常:

 ~$ convert -background none -size 1024x1024 infile.svg outfile.png
Run Code Online (Sandbox Code Playgroud)

如果使用-resize,图像模糊,文件更大.

最好

~$ rsvg  -w 1024 -h 1024 infile.svg  outfile.png
Run Code Online (Sandbox Code Playgroud)

它是最快的,具有最少的依赖性,并且输出比转换小约30%.安装librsvg2-bin来获取它.似乎没有手册页但您可以输入:

~$ rsvg --help
Run Code Online (Sandbox Code Playgroud)

得到一些帮助.简单就是好.

  • 仅供参考,当前的安装命令是“ brew install librsvg”,转换命令是“ rsvg-convert”。 (3认同)
  • 在 Ubuntu 中: `sudo apt install librsvg2-bin; rsvg-转换输入.svg -o 输出.png` (3认同)
  • 这很容易是最好的答案(我不知道为什么二十个不同的答案会给出相同的imagemagick响应);它保留了颜色和阴影,没有任何变形。但是,为了匹配imagemagick的调整大小行为(特别是WxH表示将图像缩放为适合该大小的框,并保留宽高比),应该在rsvg中使用-a参数。 (2认同)
  • 我发现 librsvg(或者 Arch 中的“rsvg-convert”)在将复杂的 svgs 转换为 png 时可以提供最佳且最一致的结果。接下来使用“optipng”来减小输出文件的大小。 (2认同)

Ian*_*Ian 18

在按照Jose Alban的回答中的步骤之后,我能够使用以下命令使ImageMagick正常工作:

convert -density 1536 -background none -resize 100x100 input.svg output-100.png
Run Code Online (Sandbox Code Playgroud)

数字1536来自球场密度估计,有关详细信息,请参阅此答案.


小智 15

为了重新缩放图像,-density应使用该选项.据我所知,标准密度为72,尺寸为1:1.如果您希望输出png是原始svg的两倍,请将密度设置为72*2 = 144:

convert -density 144 source.svg target.png
Run Code Online (Sandbox Code Playgroud)


fmw*_*w42 11

在 ImageMagick 中,如果将 Inkscape 或 RSVG 与 ImageMagick 一起使用,则可以获得比其自己的内部 MSVG/XML 渲染更好的 SVG 渲染。RSVG 是一个需要与 ImageMagick 一起安装的委托。如果系统上安装了 Inkscape,ImageMagick 将自动使用它。我在下面的 ImageMagick 中使用 Inkscape。

没有“魔法”参数可以满足您的需求。

但是,可以非常简单地计算渲染输出所需的确切密度。

这是一个以默认密度 96 渲染时的 50x50 小按钮:

convert button.svg button1.png
Run Code Online (Sandbox Code Playgroud)


在此处输入图片说明

假设我们希望输出为 500。输入为 50,默认密度为 96(旧​​版本的 Inkscape 可能使用 92)。因此,您可以根据尺寸和密度的比率来计算所需的密度。

512/50 = X/96
X = 96*512/50 = 983
Run Code Online (Sandbox Code Playgroud)


convert -density 983 button.svg button2.png
Run Code Online (Sandbox Code Playgroud)


在此处输入图片说明

在 ImageMagick 7 中,您可以按如下方式进行内联计算:

magick -density "%[fx:96*512/50]" button.svg button3.png

or

in_size=50
in_density=96
out_size=512

magick -density "%[fx:$in_density*$out_size/$in_size]" button.svg button3.png
Run Code Online (Sandbox Code Playgroud)

  • +1 表示神奇的 fx 表达式,它避免了单独的命令或计算器的使用。作为旁注,如果您运行“ide​​ntify -format "%xx %y (%wx %h) file.svg”,您还将获得输出中默认密度的宽度和高度(您需要 $in_size在公式)! (2认同)

mlo*_*ran 8

在使用 brew 的 macOS 上,直接使用 librsvg 效果很好

brew install librsvg
rsvg-convert test.svg -o test.png
Run Code Online (Sandbox Code Playgroud)

许多选项可通过 rsvg-convert --help


小智 7

你为什么不试试inkscape命令行,这是我的bat文件将这个目录中的所有svg转换为png:

FOR %% x IN(*.svg)DO C:\ Ink\App\Inkscape\inkscape.exe %% x -z --export-dpi = 500 --export-area-drawing --export-png ="% %〜nx.png"


eda*_*ank 7

对于简单的 SVG 到 PNG 转换,我发现 cairosvg ( https://cairosvg.org/ ) 的性能比 ImageMagick 好。在目录中的所有 SVG 文件上安装和运行的步骤。

pip3 install cairosvg
Run Code Online (Sandbox Code Playgroud)

在包含 .svg 文件的目录中打开一个 python shell 并运行:

import os
import cairosvg

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 
Run Code Online (Sandbox Code Playgroud)

这也将确保您不会覆盖原始 .svg 文件,但会保持相同的名称。然后,您可以使用以下命令将所有 .png 文件移动到另一个目录:

$ mv *.png [new directory]
Run Code Online (Sandbox Code Playgroud)


qub*_*dup 6

透明背景,使用 ImageMagick 7 以目标高度/大小导出:

magick -background none -size x1080 in.svg out.png
Run Code Online (Sandbox Code Playgroud)

单线质量转换器:

for i in *svg; do magick -background none -size x1080 "$i" "${i%svg}png"; done
Run Code Online (Sandbox Code Playgroud)


Qoh*_*let 5

我来到这篇文章 - 但我只是想批量快速地进行转换,而不使用任何参数(由于多个文件大小不同)。

rsvg drawing.svg drawing.png
Run Code Online (Sandbox Code Playgroud)

对我来说,要求可能比原作者要容易一些。(想在 MS PowerPoint 中使用 SVG,但不允许)

  • 作为参考,在 macOS 上,它是通过“brew install librsvg”安装的,转换命令是“rsvg-convert”。 (2认同)

小智 5

如果没有 librsvg,您可能会得到黑色 png/jpeg 图像。我们必须使用 imagemagick安装librsvg到svg 文件。convert

乌班图

 sudo apt-get install imagemagick librsvg
 convert -density 1200 test.svg test.png

Run Code Online (Sandbox Code Playgroud)

苹果系统

 brew install imagemagick librsvg
 convert -density 1200 test.svg test.png

Run Code Online (Sandbox Code Playgroud)


Shi*_*vam 5

这对我有用,并且是最容易运行的。

find . -type f -name "*.svg" -exec bash -c 'rsvg-convert -h 1000  $0 > $0.png' {} \;
rename 's/svg\.png/png/' *
Run Code Online (Sandbox Code Playgroud)

这将循环当前文件夹和子文件夹中的所有文件并查找.svg文件并将其转换为具有透明背景的 png。

确保您已安装 librsvg 并重命名 util

brew install librsvg
brew install rename
Run Code Online (Sandbox Code Playgroud)