Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ImageMagick将SVG转换为PNG?_Svg_Imagemagick_Png - Fatal编程技术网

如何使用ImageMagick将SVG转换为PNG?

如何使用ImageMagick将SVG转换为PNG?,svg,imagemagick,png,Svg,Imagemagick,Png,我有一个定义大小为16x16的SVG文件。当我使用ImageMagick的convert程序将其转换为PNG时,我得到的是一个16x16像素的PNG,它太小了: convert test.svg test.png 我需要指定输出PNG的像素大小-size参数似乎被忽略,-scale参数在转换为PNG后缩放PNG。到目前为止,我使用-density参数得到的最佳结果是: convert -density 1200 test.svg test.png 但我并不满意,因为我想以像素为单位指定输出大

我有一个定义大小为16x16的SVG文件。当我使用ImageMagick的convert程序将其转换为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

那么,我在这里必须使用的神奇参数是什么

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

convert -density 1200 -resize 200x200 source.svg target.png
基本上,它将DPI增加到足够高的程度(仅使用经过教育的/安全的猜测),从而可以以足够的质量完成调整。我试图找到一个合适的解决方案,但过了一段时间,我决定这是我目前的需要足够好

注意:使用200x200!强制执行给定的决议


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

对于(*.svg)中的%%x,执行C:\Ink\App\Inkscape\Inkscape.exe%%x-z--导出dpi=500--导出区域图形--导出png=“%%~nx.png”


在本例中,我无法从ImageMagick获得好的结果,但Inkscape在Linux和Windows上缩放SVG方面做得很好:

inkscape -z -w 1024 -h 1024 input.svg -e output.png
Inkscape 1.0用户,请注意命令行参数已更改:

inkscape -w 1024 -h 1024 input.svg -o output.png
请注意,可以忽略其中一个宽度/高度参数,以便根据输入图像尺寸自动缩放另一个参数

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


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

convert -density 144 source.svg target.png
尝试:

svgexport是一个简单的跨平台命令行工具,我为将svg文件导出为jpg和png而制作,有关更多选项,请参阅。要安装svgexport,请运行:

npm install svgexport -g

编辑:如果您发现该库存在问题,请访问GitHub,谢谢

如果您在MacOS X上,并且Imagemagick的转换有问题,您可以尝试使用RSVG lib重新安装它。 使用自制软件:

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

我来到这篇文章,但我只想通过批处理和快速转换,而不使用任何参数(由于几个文件大小不同)


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

当svg单元不是px(例如cm)时,Inkscape似乎不起作用。我得到一张空白图像。也许,这可以通过旋转新闻部来解决,但这太麻烦了

Svgexport是一个node.js程序,因此通常不太有用

Imagemagick的转换可以正常工作:

 ~$ convert -background none -size 1024x1024 infile.svg outfile.png
如果使用
-resize
,图像会模糊,文件会大得多

最佳

~$ rsvg  -w 1024 -h 1024 infile.svg  outfile.png
它速度最快,依赖性最少,输出比convert小约30%。安装librsvg2 bin以获取它。似乎没有手册页,但您可以键入:

~$ rsvg --help

为了得到一些帮助。简单很好。

我通过更改
标记的
宽度和
高度属性来解决这个问题,以匹配我的预期输出大小,然后使用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

@808sound给出的最高答案对我来说并不适用。我想调整尺寸

得到

因此,我打开Inkscape,然后转到
文件
导出为PNG文件
,并弹出一个GUI框,允许我设置所需的精确尺寸

Ubuntu 16.04 Linux上的版本:
Inkscape 0.91(2016年9月)


(顺便说一下,此图像来自)

在完成中的步骤后,我能够使用以下命令使ImageMagick正常工作:

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

数字1536来自对密度的大致估计,有关更多信息,请参阅。

一件让我头疼的事情是在输入文件名后设置
-density
。那没用。将其移动到convert中的第一个选项(在其他任何选项之前)使其工作(对于我、YMMV等)。

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

pip3 install cairosvg
在包含.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') 
这还将确保您不会覆盖原始的.svg文件,但将保持相同的名称。然后,您可以使用以下命令将所有.png文件移动到另一个目录:

$ mv *.png [new directory]

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

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

没有“神奇”参数可以满足您的需要

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

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

convert button.svg button1.png

假设我们希望输出为500。默认密度为96时,输入为50(Inkscape的旧版本可能使用92)。因此,您可以计算所需的
$ mv *.png [new directory]
 sudo apt-get install imagemagick librsvg
 convert -density 1200 test.svg test.png

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

convert button.svg button1.png
512/50 = X/96
X = 96*512/50 = 983
convert -density 983 button.svg button2.png
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
brew install librsvg
rsvg-convert test.svg -o test.png
inkscape -w 1024 -h 1024 input.svg --export-file output.png
inkscape -w 1024 -h 1024 input.svg --export-filename output.png
magick -background none -size x1080 in.svg out.png
for i in *svg; do magick -background none -size x1080 "$i" "${i%svg}png"; done