74

我想将 SVG 图像转换为具有透明背景和抗锯齿边缘的 PNG 文件(使用半透明像素)。不幸的是,我无法让 ImageMagick 进行抗锯齿,边缘看起来总是很糟糕。这是我尝试过的:

convert +antialias -background transparent  in.svg -resize 25x25 out.png

我可以使用任何想法或不同的命令行工具吗?

4

8 回答 8

118

作为旁注,我发现获得透明度有点棘手。而不是使用transparent,我不得不使用none

convert -background none in.svg out.png
于 2013-09-02T19:10:36.197 回答
59

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
于 2012-03-05T16:18:42.667 回答
17

实际上,阅读 imagemagick 文档:

-抗锯齿

在绘制字体和线条时启用/禁用抗锯齿像素的渲染。默认情况下,对象(例如文本、线条、多边形等)在绘制时会消除锯齿。使用 +antialias 禁用添加抗锯齿边缘像素。然后,这会将
添加到图像的颜色数量减少为仅直接绘制的颜色。也就是说,在绘制此类对象时不会添加混合 > 颜色。

+antialias确实会禁用抗锯齿。

于 2012-05-30T10:37:06.777 回答
11

我学习如何做到这一点的方法是从这里找到的方法:如何将 .eps 文件转换为高质量的 1024x1024 .jpg?

这与@halfer 的解决方案的想法相同inkscape——首先提升DPI——但您只需imagemagick使用该-density选项即可完成同样的事情。

convert -density 200 in.svg -resize 25x25 -transparent white out.png
于 2015-01-11T10:59:38.710 回答
5

添加该-transparent white选项可以解决问题,特别是在我的情况下,因为背景没有完全移除(不幸的是,存在浅色阴影)。所以我使用恕我直言更清晰的解决方案,使用 ImageMagic完全删除背景:

convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png

它通过 RGBA 通道设置完全透明的黑色作为背景。

于 2018-09-18T23:07:40.860 回答
4

对我来说,适用于 svg 到 png:

convert ${src} \
    -transparent white \
    -background none \
    -resize 345x345 \
    res/drawable-xxxhdpi/${dest}
于 2020-04-25T14:35:10.817 回答
-1

我添加一个矩形作为背景。嵌入 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
于 2018-10-05T11:56:39.273 回答
-1

如果我-resize-scale. 然后,antialias甚至不需要标志。

于 2019-09-21T09:05:17.533 回答