我有一个定义为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
这里我要用到的神奇参数是什么?
在ImageMagick中,如果使用Inkscape或RSVG与ImageMagick一起渲染,就会得到更好的SVG渲染,而不是自己内部的MSVG/XML渲染。RSVG是一个委托,需要与ImageMagick一起安装。如果Inkscape安装在系统上,ImageMagick将自动使用它。我使用Inkscape在ImageMagick下面。
没有什么“神奇的”参数可以满足您的需求。
但是,我们可以非常简单地计算出渲染输出所需的精确密度。
下面是一个小的50x50按钮,默认渲染密度为96:
convert button.svg button1.png
假设我们希望输出是500。输入是50,默认密度为96(旧版本的Inkscape可能使用92)。所以你可以根据尺寸和密度的比例来计算所需的密度。
512/50 = X/96
X = 96*512/50 = 983
convert -density 983 button.svg button2.png
在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
在这个例子中,我还没有能够从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的结果: