我有一个定义为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单位不是px(例如cm)时,Inkscape似乎无法工作。我得到一个空白图像。也许,它可以通过旋转dpi来修复,但它太麻烦了。
Svgexport是一个node.js程序,所以通常不太有用。
Imagemagick的转换工作正常:
convert -background none -size 1024x1024 infile.svg outfile.png
如果您使用-resize,图像是模糊的,文件是大得多。
BEST
rsvg-convert -w 1024 -h 1024 infile.svg -o outfile.png
它速度最快,依赖性最小,输出比convert小30%左右。安装librsvg2-bin获取:
sudo apt install -y librsvg2-bin
似乎没有手册页,但你可以输入:
rsvg-convert --help
去寻求帮助。简单就是好。
我用增加密度的一般方法得到了“低聚”曲线。所以我决定深入挖掘并解决这个问题,因为这似乎是这种方法的一个副作用,我认为这与原始密度或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)
在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