转换SVG并将其调整为PNG

时间:2013-08-12 16:39:00

标签: svg imagemagick png image-resizing

我正在尝试将SVG转换为PNG(或任何栅格格式)并同时调整大小。

我以为我会使用ImageMagick执行此任务,但似乎在调整大小之前会转换为栅格。

这会导致图像质量不佳。

  • 在转换为栅格之前,有没有办法让ImageMagick调整SVG的大小?

  • 还是有其他工具可以用来在调整大小后以程序方式将SVG转换为栅格吗?

  • 或者,我可以使用其他工具吗?

目前我正在通过命令行使用ImageMagick:

convert file.svg -resize 100x100 file.png

源图像“大小”未知,直到运行时才知道目标大小。

6 个答案:

答案 0 :(得分:32)

SVG被定义为向量,而不是位图 - 这就是IM喜欢处理的内容。当IM读取矢量时,它不知道大小,所以当你这样做时:

convert compass.svg -resize 1000x1000 compassB.jpg

它创建一个默认大小的位图画布,“绘制”向量,然后调整大小并将其保存为JPEG。结果,如果您的预期尺寸大于IM “猜测”的画布质量差 - 它无法创建由于将图像光栅化到太小的画布而不再具有的信息。 / p>

enter image description here

解决方案是告诉IM 预先,需要将矢量绘制到大画布上,之前它栅格化:

convert -size 1000x1000 compass.svg compassA.jpg

enter image description here

答案 1 :(得分:31)

这就是我这样做的方式,似乎有效。

convert -background none -density 1000 -resize 1000x compass.svg compass.png

这是每个部分的作用。

  • 使用-background none确保SVG的任何透明部分保持透明,而不是填充白色。
  • 由于ImageMagick仅适用于光栅图像,因此您需要使用-density 1000并指定要调整SVG大小的宽度。这样,当您实际调用resize命令时,加载的SVG的栅格表示将具有1000的宽度,否则您将最终从SVG图像的原始大小向上或向下调整栅格大小。
  • 现在使用-resize 1000x为您的SVG增加一个新宽度,将自动计算高度以保持宽高比。

这个问题的一个缺陷是,我真的不知道如何根据高度调整大小,并且计算宽度,因为-density应用于宽度,而不是高度。因此,您必须事先知道SVG的实际比率并相应地使用宽度。

答案 2 :(得分:8)

我为此做了svgexport

svgexport file.svg file.png 100:100

答案 3 :(得分:4)

事实证明,inkscape有一个命令行界面。

不幸的是,inkscape的-w-h参数不保留宽高比。但它确实提供了一种查询当前宽度和高度的方法 - 但一次只能查询一个。

所以解决方案是运行inkscape不少于3次。

inkscape -f svgfile.svg -W
<read stdin into some variable>
inkscape -f svgfile.svg -H
<read stdin into some variable>
<calculate aspect ratio and apply logic to retain aspect for new size>
inkscape -f svgfile.svg -w <newwidth> -h <newheight> -e file.png

在我的实例中,我必须通过ImageMagick运行生成的文件来执行其他操作。

从C#做这一切是至关重要的,所以这个问题仍然是开放的,以便找到更好的解决方案。

答案 4 :(得分:0)

奇怪的是,ImageMagick将以一种尺寸渲染,然后重新缩放位图。除非,即SVG具有其中定义的特定大小。检查您正在使用的SVG文件的widthheight属性。尝试将宽度和高度更改为100%,看看是否会产生影响。

<svg width="100%" height="100%" ...etc...>

(假设您可以控制正在使用的SVG文件)。

答案 5 :(得分:0)

使用 image magick 7,您可以在一行中执行以下操作:

magick in.svg -density "%[fx:((1080/w)*72)]" -delete 0 -background none in.svg -scale 1080x out.png

这将自动确定正确的密度,使其以正确的分辨率进行缩放。将 2 个“1080”值交换为您喜欢的 png 宽度。