Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SVG转换为PNG并调整其大小_Svg_Imagemagick_Png_Image Resizing - Fatal编程技术网

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

将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 源图像“大小

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

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

这会导致图像质量差

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

  • 或者,在调整SVG的大小后,是否可以使用其他工具以编程方式将其转换为光栅

  • 或者,是否有其他工具可供我使用

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

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
以下是每个部分的作用

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

其中一个陷阱是,我真的不知道如何根据高度调整大小并计算宽度,因为
-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。