我想将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
有什么想法或我可以使用的其他命令行工具吗?
Answers:
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
注意,引用的Wiki上带有引号--export-type=png
,这是不正确的。
另外,如果没有Inkscape命令行,MacOS可以通过bash直接访问:
/Applications/Inkscape.app/Contents/MacOS/inkscape
作为附带说明,我发现获得透明度有点棘手。而不是使用的透明,我不得不使用无。
convert -background none in.svg out.png
-background none
在Mac上为我工作的ImageMagick 6.8.6-6
convert in.svg -background none out.png
,我发现此顺序将无法使背景透明;它导致不透明的白色背景!请确保in.svg
和out.png
是最后两个参数)命令
我学习此方法的方法是从此处找到的方法:如何将.eps文件转换为高质量的1024x1024 .jpg?
这与@halfer的解决方案具有相同的思想,inkscape
即先提升DPI,但只需imagemagick
使用该-density
选项即可完成相同的操作。
convert -density 200 in.svg -resize 25x25 -transparent white out.png
添加-transparent white
选项可以解决该问题,尤其是在我的情况下,因为背景并未完全删除(不幸的是存在光影)。因此,我正在使用恕我直言的更清晰的解决方案,该解决方案可使用ImageMagic完全删除背景:
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
它通过RGBA通道将完全透明的黑色设置为背景。
-transparent
选项的相关文档:imagemagick.org/script/command-line-options.php#transparent
我添加一个矩形作为背景。嵌入的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