将SVG转换为PNG并调整其大小
我正在尝试将SVG转换为PNG(或任何光栅格式),同时调整大小 我原以为我会使用ImageMagick来完成这项任务,但在调整大小之前,它似乎正在转换为光栅 这会导致图像质量差将SVG转换为PNG并调整其大小,svg,imagemagick,png,image-resizing,Svg,Imagemagick,Png,Image Resizing,我正在尝试将SVG转换为PNG(或任何光栅格式),同时调整大小 我原以为我会使用ImageMagick来完成这项任务,但在调整大小之前,它似乎正在转换为光栅 这会导致图像质量差 有没有办法让ImageMagick在转换为光栅之前调整SVG的大小 或者,在调整SVG的大小后,是否可以使用其他工具以编程方式将其转换为光栅 或者,是否有其他工具可供我使用 目前我通过命令行使用ImageMagick: convert file.svg -resize 100x100 file.png 源图像“大小
- 有没有办法让ImageMagick在转换为光栅之前调整SVG的大小
- 或者,在调整SVG的大小后,是否可以使用其他工具以编程方式将其转换为光栅
- 或者,是否有其他工具可供我使用
convert file.svg -resize 100x100 file.png
源图像“大小”未知,目标大小直到运行时才知道。奇怪的是,ImageMagick将以一种大小渲染,然后重新缩放位图。除非SVG中定义了特定的大小。检查正在使用的SVG文件的
宽度
和高度
属性。尝试将宽度和高度更改为100%
,看看这是否有区别
<svg width="100%" height="100%" ...etc...>
(假设您可以控制正在使用的SVG文件)。因此,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
inkscape-f svgfile.svg-W
inkscape-f svgfile.svg-H
inkscape-f svgfile.svg-w-h-e file.png
在我的实例中,我必须通过ImageMagick运行生成的文件以执行其他操作
至少可以说,从C#执行所有这些操作都很麻烦,因此这个问题还有待于找到更好的解决方案。我已经为此制定了:
svgexport file.svg file.png 100:100
SVG被定义为一个向量,而不是位图,这正是我喜欢处理的。当IM在中读取向量时,它不知道大小,因此当您执行此操作时:
convert compass.svg -resize 1000x1000 compassB.jpg
它创建一个默认大小的位图画布,“绘制”向量,然后调整其大小并将其保存为JPEG
。结果是,如果您的预期大小大于IM“猜测”的画布,则质量较差-由于将图像栅格化到太小的画布上,因此无法创建不再具有的信息
解决方案是告诉IM在光栅化之前,需要将向量绘制到一个大画布上:
convert -size 1000x1000 compass.svg compassA.jpg
我就是这样做的,而且似乎很管用
convert -background none -density 1000 -resize 1000x compass.svg compass.png
以下是每个部分的作用
- 使用
确保SVG的任何透明部分保持透明,并且不会被白色填充-background none
- 由于ImageMagick仅适用于光栅图像,因此需要使用
,并指定要调整SVG大小的宽度。这样,当您实际调用resize命令时,加载的SVG的光栅表示将已经具有1000的宽度,否则您将最终从SVG图像的原始大小向上或向下调整光栅的大小-density 1000
- 现在使用
为SVG提供新的宽度,高度将自动计算以保持纵横比-resize1000x
其中一个陷阱是,我真的不知道如何根据高度调整大小并计算宽度,因为
-density
应用于宽度,而不是高度。因此,您必须事先知道SVG的实际比率,并相应地处理宽度。使用image magick 7,您可以在一行中完成以下操作:
magick in.svg -density "%[fx:((1080/w)*72)]" -delete 0 -background none in.svg -scale 1080x out.png
这将自动确定正确的密度,使其以正确的分辨率缩放。将2个“1080”值交换为您喜欢的png宽度。显示您的命令issuing@Tarik我添加了不正确的cmdline@MarkSetchell奥巴马的答案是正确的。您需要在命令行中预先设置画布大小。有关ImageMagick命令结构及其参数顺序的更多详细信息,请参阅。这是一个有趣的解决方案。我没有尝试过,因为我现在已经用另一种方式解决了这个问题(尽管相当复杂)。几分钟后回答。不幸的是,我无法控制源SVG。这很有道理。我会调查的,thanks@DJL这是正确的答案。如果你不接受,至少请投赞成票@KurtPfeifle,一旦我有机会检查一下,我会的。这个问题最初是6个月前提出的。从那以后,我开始做其他的事情。我一直没能让它工作。可能我的ImageMagick版本太旧了。这对我也不起作用,图像是以原始(XML定义)大小保存的。
-density x
是使其大于默认值的缺失部分。这是一个很棒的工具,但不幸的是,我无法再使用它,因为它依赖于已被弃用的PhantomJS。