转换SVG并将其调整为PNG

DJL*_*DJL 29 svg png imagemagick image-resizing

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

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

这导致图像质量差.

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

  • 或者是否有一些其他工具可用于在调整大小后以程序方式将SVG转换为栅格?

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

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

convert file.svg -resize 100x100 file.png
Run Code Online (Sandbox Code Playgroud)

源图像"大小"未知,目标大小直到运行时才知道.

Mar*_*ell 35

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

convert compass.svg -resize 1000x1000 compassB.jpg
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

解决的办法是告诉IM 的前期的载体需要被拉伸到大画布,之前它rasterises:

convert -size 1000x1000 compass.svg compassA.jpg
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我无法让这个工作.可能我的ImageMagick版本太旧了 (6认同)
  • 这对我来说也不起作用,图像保存在它的原始(在XML中定义)大小. (3认同)

Ton*_*nov 35

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

convert -background none -density 1000 -resize 1000x compass.svg compass.png
Run Code Online (Sandbox Code Playgroud)

这是每个部分的作用.

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

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

  • `-density x`是使它大于默认值的缺失部分 (2认同)

Ali*_*iba 13

我为此制作了svgexport:

svgexport file.svg file.png 100:100
Run Code Online (Sandbox Code Playgroud)


DJL*_*DJL 5

因此事实证明,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
Run Code Online (Sandbox Code Playgroud)

在我的实例中,我不得不通过ImageMagick运行生成的文件以执行其他操作。

至少可以说,用C#进行所有这些工作很麻烦,因此对于更好的解决方案来说,这个问题仍然悬而未决。


Pau*_*eau 0

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

<svg width="100%" height="100%" ...etc...>
Run Code Online (Sandbox Code Playgroud)

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