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

convert test.svg test.png

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

convert -density 1200 test.svg test.png

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

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

这里我要用到的神奇参数是什么?


当前回答

如果你在MacOS X上,Imagemagick的转换有问题,你可以尝试用RSVG库重新安装它。 使用自制程序:

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。

其他回答

我通过更改<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

我用增加密度的一般方法得到了“低聚”曲线。所以我决定深入挖掘并解决这个问题,因为这似乎是这种方法的一个副作用,我认为这与原始密度或dpi有关。

我们在这个答案中看到72和这个答案中的96被建议作为图像的默认密度,但哪一个呢?如果我的不一样呢?

ImageMagick有一种方法来整理:

identify -verbose test.svg

这将输出大量关于图像文件的元数据,包括:

Image:
  Filename: test.svg
  Format: SVG (Scalable Vector Graphics)
  Mime type: image/svg+xml
  Class: ...
  Geometry: ...
  Resolution: 37.79x37.79
  Print size: ...
  Units: PixelsPerCentimeter
  # and a whole lot MORE ...

对于更简洁的查询,您可以尝试:

identify -format "%x x %y %U" test.svg
=> 37.789999999999999147 x 37.789999999999999147 PixelsPerCentimeter

正如这篇论坛帖子所建议的,并在本文档中进行了修改

现在我们知道了图像的当前密度,但可能需要将其转换为正确的转换或mogriing单位(PixelsPerInch或dpi)

这是一个简单的pixelspercm x 2.54的计算

37.789999999999999147 x 2.54 = 95.9866 ~> 96

如果你更喜欢图表或在线计算器,你可以试试https://www.pixelto.net/cm-to-px-converter。

现在,我们已经将正确的原始密度转换为dpi,上述答案中所述的其余逻辑都就位了,并且可以通过乘以原始密度将SVG文件缩放到更好的“分辨率”。

对我来说,原始密度作为PNG像素化得太过了,所以在我的情况下,5倍原始密度或- 480密度对我来说已经足够了。记住,这也会调整图像的大小,与原始的svg相比,当使用/实现图像时,您将需要为此进行调整。

注意:我也尝试了Inkscape方法,也有像素问题,但已经看到了密度方法的改进,所以我决定更深入地挖掘它。然而,Inkscape尝试的输出给了我一个想法,你也可以用它来确定dpi,但是为了得到你已经可以用ImageMagick得到的东西,需要安装很多东西

Area 0:0:20.75:17 exported to 21 x 17 pixels (96 dpi)

这对我来说是最有效的,也是最容易运行的。

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

如果你在MacOS X上,Imagemagick的转换有问题,你可以尝试用RSVG库重新安装它。 使用自制程序:

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。

Try svgexport:

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

svgexport是一个简单的跨平台命令行工具,我已经为导出svg文件jpg和png,看到这里更多的选项。要安装svgexport install npm,执行以下命令:

npm install svgexport -g

编辑:如果你发现图书馆的问题,请在GitHub上提交,谢谢!