我正在尝试将 SVG 转换为 PNG(或任何光栅格式)并同时调整大小。
我以为我会使用 ImageMagick 来完成此任务,但它似乎在调整大小之前转换为光栅。
这会导致图像质量较差。
有没有办法让 ImageMagick 在转换为光栅之前调整 SVG 的大小?
或者我可以使用其他一些工具在调整大小后以编程方式将 SVG 转换为栅格吗?
或者,我可以使用其他工具吗?
目前我正在通过命令行使用 ImageMagick:
convert file.svg -resize 100x100 file.png
源图像“大小”未知,目标大小直到运行时才知道。
我就是这样做的,看起来很有效。
convert -background none -density 1000 -resize 1000x compass.svg compass.png
以下是每个部分的作用。
-background none
确保 SVG 的任何透明部分保持透明并且不会被白色填充。-density 1000
并指定要调整 SVG 大小的宽度。这样,当您实际调用调整大小命令时,加载的 SVG 的光栅表示形式将已经具有 1000 的宽度,否则您最终将根据 SVG 图像的原始大小向上或向下调整光栅大小。-resize 1000x
给你的SVG一个新的宽度,高度将自动计算以保持纵横比。其中一个陷阱是,我真的不知道如何根据高度调整大小并计算宽度,因为
-density
应用于宽度,而不是高度。因此,您必须事先知道 SVG 的实际比例并相应地使用宽度。
SVG
被定义为向量,而不是位图 - 这是 IM 喜欢处理的。当 IM 读入向量时,它不知道大小,所以当你这样做时:
convert compass.svg -resize 1000x1000 compassB.jpg
它创建一个默认大小的位图画布,“绘制”矢量到其上,然后调整其大小并将其保存为
JPEG
。结果,如果您的预期尺寸大于 IM “猜测” 的画布,则质量很差 - 由于将图像光栅化到太小的画布上,它无法创建不再具有的信息。
解决方案是告诉 IM up-front 需要将矢量绘制到大画布上,在光栅化之前:
convert -size 1000x1000 compass.svg compassA.jpg
我为此制作了svgexport:
svgexport file.svg file.png 100:100
原来 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# 中完成这一切至少可以说很麻烦,因此这个问题仍然有待更好的解决方案。
使用 image magick 7,您可以在一行中执行以下操作:
magick in.svg -density "%[fx:((1080/w)*72)]" -delete 0 -background none in.svg -scale 1080x out.png
这将自动确定正确的密度,以使其以正确的分辨率缩放。将 2 个“1080”值交换为您喜欢的 png 宽度。
奇怪的是,ImageMagick 会以一种尺寸渲染,然后重新缩放位图。除非 SVG 中定义了特定的大小。检查您正在使用的 SVG 文件的
width
和 height
属性。尝试将宽度和高度更改为 100%
,看看是否会有所不同。
<svg width="100%" height="100%" ...etc...>
(假设您可以控制正在使用的 SVG 文件)。
这里的一些答案对我来说不起作用。
问题与光栅化的密度有关,而不是目标图像的大小。默认情况下,ImageMagick 以 72 dpi 光栅化 SVG。要增加密度,您可以添加
-density
标志,如下所示:
convert -density 288 input.svg output.png
我从本指南中得到了这一点: https://makandracards.com/makandra/506738-imagemagick-converting-svg-to-raster-image-formats-like-png-or-jpeg