我想将SVG图像转换为带有透明背景和反锯齿边缘(使用半透明像素)的PNG文件。不幸的是,我无法让ImageMagick进行抗锯齿处理,边缘看起来总是很糟糕。这是我尝试过的:
convert +antialias -background transparent in.svg -resize 25x25 out.png
有什么想法或者我可以使用不同的命令行工具吗?
我想将SVG图像转换为带有透明背景和反锯齿边缘(使用半透明像素)的PNG文件。不幸的是,我无法让ImageMagick进行抗锯齿处理,边缘看起来总是很糟糕。这是我尝试过的:
convert +antialias -background transparent in.svg -resize 25x25 out.png
有什么想法或者我可以使用不同的命令行工具吗?
使用-background none
代替-background transparent
。
convert -background none in.svg out.png
注意:参数的顺序很重要。
Inkscape可以做到这一点:
inkscape \
--export-png=out.png --export-dpi=200 \
--export-background-opacity=0 --without-gui in.svg
术语已经更改:所有导出参数都会抑制GUI界面,输出参数现在根据文件类型简单确定。例如,png
类型将导致将 /path/to/picture.svg
文件导出为 /path/to/picture.png
(注意:这将覆盖输出文件)。
inkscape \
--export-type=png --export-dpi=200 \
--export-background-opacity=0 picture.svg
请注意引用的维基页面中关于 --export-type=png
的引述是错误的。
如果没有Inkscape命令行,MacOS可以直接通过bash访问:
/Applications/Inkscape.app/Contents/MacOS/inkscape
-background none
」选项的答案更好,因为它实际上使用了被询问的工具 ImageMagick…”:https://dev59.com/FGkw5IYBdhLWcg3w9_Qi#18579465 - Fredrick Brennan实际上,阅读 ImageMagick 文档:
-antialias
绘制字体和线条时启用/禁用反锯齿像素的渲染。默认情况下,对象(例如文本、线条、多边形等)在绘制时是抗锯齿的。使用 +antialias 来禁用添加反锯齿边缘像素。这将减少添加到图像中的颜色数量,仅限于直接绘制的颜色。也就是说,在绘制此类对象时不会添加混合颜色。
+antialias 将确实禁用反锯齿效果。
我学习这种方法是从这里找到的方法:如何将 .eps 文件转换为高质量的 1024x1024 .jpg?
这与 @halfer 的解决方案相同,使用 inkscape
来提高 DPI,但你可以仅使用 imagemagick
并使用 -density
选项来完成相同的事情。
convert -density 200 in.svg -resize 25x25 -transparent white out.png
对我而言,以下方法可将SVG转换为PNG:
convert ${src} \
-transparent white \
-background none \
-resize 345x345 \
res/drawable-xxxhdpi/${dest}
在我的情况下,添加-transparent white
选项 特别解决了问题,因为背景没有完全被移除(不幸的是还有轻微的阴影)。因此,我使用了更清晰的解决方案,可以完全去除背景,使用 ImageMagic:
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
它通过 RGBA 通道设置完全透明的黑色背景。
-transparent
选项的相关文档:http://www.imagemagick.org/script/command-line-options.php#transparent - icc97如果我用-scale
替换-resize
,就可以得到更好的抗锯齿效果。这样,antialias
标志甚至都不必要了。
我添加了一个矩形作为背景。 嵌入的CSS隐藏了背景。 然后我捕获它的颜色,以设置ImageMagick的透明属性。
SVG 文件:
<?xml version="1.0" ?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
<svg
version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="500px" height="500px"
viewBox="0 0 500 500"
enable-background="new 0 0 500 500"
>
<defs>
<style>
#background { display: none; }
</style>
</defs>
<rect id="background" x="0" y="0" width="500" height="500" fill="#e8e437"/>
<!-- beginning of the sketch -->
<g fill="#000" text-anchor="middle"font-size="112">
<text y="350" x="192">OK</text>
</g>
<!-- end of the sketch -->
</svg>
bash脚本
#!/bin/bash
BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )
SVG_DIR="$BASE_DIR/import"
PNG_DIR="$BASE_DIR/export"
for f in `ls $SVG_DIR/*.svg`
do
g="$PNG_DIR/$(basename "$f" .svg).png"
BGCOLOR=`grep 'id="background"' $f \
| sed 's/.* fill="\([^"]*\)".*/\1/'`
convert $f -transparent "$BGCOLOR" $g
done
convert in.svg -background none out.png
),但我发现这种顺序会导致背景不透明;结果是一个不透明的白色背景!请确保in.svg
和out.png
是命令中的最后两个参数。 - kostmorgba(0, 0, 0, 0.0)
的简写。"* - icc97