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)

Ton*_*nov 35
这是我这样做的方式,似乎有效.
convert -background none -density 1000 -resize 1000x compass.svg compass.png
Run Code Online (Sandbox Code Playgroud)
这是每个部分的作用.
-background none确保SVG的任何透明部分保持透明,而不是填充白色.-density 1000并指定要调整SVG大小的宽度.这样,当您实际调用resize命令时,加载的SVG的栅格表示将具有1000的宽度,否则您将最终从SVG图像的原始大小向上或向下调整栅格大小.-resize 1000x用来给你的SVG一个新的宽度,高度将自动计算以保持纵横比.这个问题的一个缺陷是,我真的不知道如何根据高度调整大小,然后计算宽度,因为-density应用于宽度,而不是高度.因此,您必须事先知道SVG的实际比率并相应地处理宽度.
Ali*_*iba 13
我为此制作了svgexport:
svgexport file.svg file.png 100:100
Run Code Online (Sandbox Code Playgroud)
因此事实证明,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#进行所有这些工作很麻烦,因此对于更好的解决方案来说,这个问题仍然悬而未决。
奇怪的是,ImageMagick 会以一种尺寸渲染,然后重新缩放位图。除非 SVG 中定义了特定的大小。检查您正在使用的 SVG 文件的属性width和属性。height尝试更改宽度和高度,100%看看是否有影响。
<svg width="100%" height="100%" ...etc...>
Run Code Online (Sandbox Code Playgroud)
(假设您可以控制正在使用的 SVG 文件)。