我有一个定义为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
这里我要用到的神奇参数是什么?
我通过更改<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
在这个例子中,我还没有能够从ImageMagick得到很好的结果,但Inkscape在Linux和Windows上缩放SVG方面做得很好:
# Inkscape v1.0+
inkscape -w 1024 -h 1024 input.svg -o output.png
# Inkscape older than v1.0
inkscape -z -w 1024 -h 1024 input.svg -e output.png
注意,您可以省略一个宽度/高度参数,让另一个参数根据输入图像尺寸自动缩放。
下面是使用这个命令将16x16的SVG缩放为200x200的PNG的结果: