使用ImageMagick将SVG转换为带抗锯齿的透明PNG

时间:2012-03-02 09:03:25

标签: svg imagemagick png inkscape

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

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

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

8 个答案:

答案 0 :(得分:82)

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

convert -background none in.svg out.png

答案 1 :(得分:54)

Inkscape会这样做:

inkscape \
    --export-png=out.png --export-dpi=200 \
    --export-background-opacity=0 --without-gui in.svg

答案 2 :(得分:16)

实际上,阅读imagemagick文档:

  

-antialias

     

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

+ antialias 确实会禁用抗锯齿。

答案 3 :(得分:10)

我学习如何做到这一点的方法来自于此处的方法:How to convert a .eps file to a high quality 1024x1024 .jpg?

与@ halfer的inkscape解决方案一样 - 首先提升DPI - 但你可以使用{{imagemagick完成同样的事情。 1}}选项。

-density

答案 4 :(得分:1)

添加-transparent white选项特别解决了该问题,因为我没有完全删除背景(不幸的是存在阴影)。因此,我使用的是IMHO更清晰的解决方案,该解决方案通过ImageMagic完全消除了背景

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

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

答案 5 :(得分:1)

对我来说,它可以将svg转换为png:

convert ${src} -transparent white -background none  -resize 345x345 res/drawable-xxxhdpi/${dest}

答案 6 :(得分:0)

我添加一个rect作为背景。 嵌入的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

答案 7 :(得分:0)

如果我将-resize替换为-scale,我会得到更好的抗锯齿效果。然后,甚至不需要antialias标志。