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

时间:2012-03-24 16:24:39

标签: svg imagemagick png

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

convert test.svg test.png

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

convert -density 1200 test.svg test.png

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

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

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

19 个答案:

答案 0 :(得分:419)

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

inkscape -z -e test.png -w 1024 -h 1024 test.svg

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

enter image description here

enter image description here

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

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

在Windows 7上,它是:

Inkscape 0.48.4 r9939 (Dec 17 2012)

答案 1 :(得分:116)

尝试svgexport

svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024

svgexport是我用于将svg文件导出到jpg和png的简单跨平台命令行工具,有关更多选项,请参阅here。要安装svgexport install npm,请运行:

npm install svgexport -g

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

答案 2 :(得分:93)

这并不完美,但它确实起到了作用。

convert -density 1200 -resize 200x200 source.svg target.png

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

  

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

答案 3 :(得分:52)

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

brew remove imagemagick
brew install imagemagick --with-librsvg

验证它是否正确委派:

$ 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

应显示rsvg

答案 4 :(得分:31)

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

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

Imagemagick的转换效果正常:

px

如果您使用 ~$ convert -background none -size 1024x1024 infile.svg outfile.png ,则图像模糊且文件更大。

<强> BEST

-resize

速度最快,依赖性最低,输出比转换小约30%。安装librsvg2-bin来获取它。似乎没有手册页,但您可以输入:

~$ rsvg  -w 1024 -h 1024 infile.svg  outfile.png

获得一些帮助。简单就是好。

答案 5 :(得分:16)

按照Jose Alban's answer中的步骤操作后,我可以使用以下命令让ImageMagick正常工作:

convert -density 1536 -background none -resize 100x100 input.svg output-100.png

数字1536来自密度的大概估计,有关详细信息,请参阅this answer

答案 6 :(得分:14)

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

convert -density 144 source.svg target.png

答案 7 :(得分:7)

为什么不尝试使用inkscape命令行,这是我的bat文件将此dir中的所有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”

答案 8 :(得分:3)

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

rsvg drawing.svg drawing.png

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

答案 9 :(得分:3)

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

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

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

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

convert button.svg button1.png


enter image description here

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

512/50 = X/96
X = 96*512/50 = 983


convert -density 983 button.svg button2.png


enter image description here

在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

答案 10 :(得分:3)

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

brew install librsvg
rsvg-convert test.svg -o test.png

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

使用

答案 11 :(得分:2)

有一点让我感到惊讶的是在输入文件名之后设置-density。那不行。将它移动到转换中的第一个选项(在其他任何事情之前)使它工作(对我来说,YMMV等)。

答案 12 :(得分:2)

这对我有用

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

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

确保已安装librsvg并重命名util

brew install librsvg
brew install rename

答案 13 :(得分:1)

通过更改width标记的height<svg>属性以匹配我的预期输出大小,然后使用ImageMagick进行转换,我解决了这个问题。像魅力一样。

这是我的Python代码,这个函数将返回JPG文件的内容:

import gzip, re, os
from ynlib.files import ReadFromFile, WriteToFile
from ynlib.system import Execute
from xml.dom.minidom import parse, parseString


def SVGToJPGInMemory(svgPath, newWidth, backgroundColor):

    tempPath = os.path.join(self.rootFolder, 'data')
    fileNameRoot = 'temp_' + str(image.getID())

    if svgPath.lower().endswith('svgz'):
        svg = gzip.open(svgPath, 'rb').read()
    else:
        svg = ReadFromFile(svgPath)

    xmldoc = parseString(svg)

    width = float(xmldoc.getElementsByTagName("svg")[0].attributes['width'].value.split('px')[0])
    height = float(xmldoc.getElementsByTagName("svg")[0].attributes['height'].value.split('px')[0])

    newHeight = int(newWidth / width * height) 

    xmldoc.getElementsByTagName("svg")[0].attributes['width'].value = '%spx' % newWidth
    xmldoc.getElementsByTagName("svg")[0].attributes['height'].value = '%spx' % newHeight

    WriteToFile(os.path.join(tempPath, fileNameRoot + '.svg'), xmldoc.toxml())
    Execute('convert -background "%s" %s %s' % (backgroundColor, os.path.join(tempPath, fileNameRoot + '.svg'), os.path.join(tempPath, fileNameRoot + '.jpg')))

    jpg = open(os.path.join(tempPath, fileNameRoot + '.jpg'), 'rb').read()

    os.remove(os.path.join(tempPath, fileNameRoot + '.jpg'))
    os.remove(os.path.join(tempPath, fileNameRoot + '.svg'))

    return jpg

答案 14 :(得分:1)

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

pip3 install cairosvg

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

import os

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

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

$ mv *.png [new directory]

答案 15 :(得分:1)

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

Ubuntu

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

MacOS

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

答案 16 :(得分:1)

在将Inkscape 1.0从svg转换为png的Linux上,需要使用

ToStringStyle

不是

inkscape -w 1024 -h 1024 input.svg --export-file output.png

答案 17 :(得分:0)

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

magick -background none -size x1080 in.svg out.png

单线质量转换器:

for i in *svg; do magick -background none -size x1080 "$i" "${i%svg}png"; done

答案 18 :(得分:0)

@ 808sound的最佳答案对我不起作用。我想调整大小 Kenney.nl UI Pack

得到了 Kenney UI Pack messed up

所以我打开了Inkscape,然后转到FileExport as PNG file并弹出一个GUI框,让我可以设置我需要的确切尺寸。

Ubuntu 16.04 Linux上的版本: Inkscape 0.91 (September 2016)

(顺便说一句,此图片来自Kenney.nl's asset packs