首页 文章

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

提问于
浏览
286

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

convert test.svg test.png

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

convert -density 1200 test.svg test.png

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

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

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

13 回答

  • 13

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

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

    Imagemagick的转换工作正常:

    ~$ convert -background none -size 1024x1024 infile.svg outfile.png
    

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

    BEST

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

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

    ~$ rsvg --help
    

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

  • 81

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

    rsvg drawing.svg drawing.png
    

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

  • 384

    在这个例子中,我无法从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)
    
  • 0

    我已经通过更改 <svg> 标签的 widthheight 属性以匹配我的预期输出大小然后使用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
    
  • 24

    如果您使用的是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 .

  • 6

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

    得到
    Kenney UI Pack messed up

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

    版本 Ubuntu 16.04 LinuxInkscape 0.91 (September 2016)

    (此图片来自Kenney.nl's asset packs

  • 2

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

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

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

  • 1

    你为什么不试试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”

  • 49

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

  • 8

    对于简单的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]
    
  • 0

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

    convert -density 144 source.svg target.png
    
  • 1

    这不是完美的,但它确实起到了作用 .

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

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

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

  • 102

    试试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,谢谢!

相关问题