将 SVG 转换为 PNG 并调整其大小

问题描述 投票:0回答:7

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

我以为我会使用 ImageMagick 来完成此任务,但它似乎在调整大小之前转换为光栅。

这会导致图像质量较差。

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

  • 或者我可以使用其他一些工具在调整大小后以编程方式将 SVG 转换为栅格吗?

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

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

convert file.svg -resize 100x100 file.png

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

svg imagemagick png image-resizing
7个回答
50
投票

我就是这样做的,看起来很有效。

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

以下是每个部分的作用。

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

其中一个陷阱是,我真的不知道如何根据高度调整大小并计算宽度,因为

-density
应用于宽度,而不是高度。因此,您必须事先知道 SVG 的实际比例并相应地使用宽度。


41
投票

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

convert compass.svg -resize 1000x1000 compassB.jpg

它创建一个默认大小的位图画布,“绘制”矢量到其上,然后调整其大小并将其保存为

JPEG
。结果,如果您的预期尺寸大于 IM “猜测” 的画布,则质量很差 - 由于将图像光栅化到太小的画布上,它无法创建不再具有的信息。

enter image description here

解决方案是告诉 IM up-front 需要将矢量绘制到大画布上,在光栅化之前

convert -size 1000x1000 compass.svg compassA.jpg

enter image description here


12
投票

我为此制作了svgexport

svgexport file.svg file.png 100:100

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

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

从 C# 中完成这一切至少可以说很麻烦,因此这个问题仍然有待更好的解决方案。


3
投票

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

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

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


0
投票

奇怪的是,ImageMagick 会以一种尺寸渲染,然后重新缩放位图。除非 SVG 中定义了特定的大小。检查您正在使用的 SVG 文件的

width
height
属性。尝试将宽度和高度更改为
100%
,看看是否会有所不同。

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

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


0
投票

这里的一些答案对我来说不起作用。

问题与光栅化的密度有关,而不是目标图像的大小。默认情况下,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

© www.soinside.com 2019 - 2024. All rights reserved.