使用ImageMagick和命令行提示设置透明背景

时间:2012-02-06 03:48:41

标签: png imagemagick alpha-transparency

假设您有任何图像(PNG或JPG)。 这张图片有白色背景,我需要让这个背景透明。

我尝试过这些例子:

  • convert original.png -background none transparent.png
  • convert original.png -background white -flatten -alpha off transparent.png

但没有令人满意的结果。

我该怎么做?

重要提示:使用convert命令行。

8 个答案:

答案 0 :(得分:118)

我在Ubuntu 12.04上使用ImageMagick 6.6.9-7 对我有用的是:

convert test.png -transparent white transparent.png

将test.png中的所有白色更改为透明。

答案 1 :(得分:67)

我遇到了同样的问题。我必须使用ImageMagick从jpg / png图像格式中删除白色背景。

对我有用的是:

1)将图像格式转换为png:convert input.jpg input.png

2)convert input.png -fuzz 2% -transparent white output.png

答案 2 :(得分:28)

解决方案

color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
    \( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
       -alpha extract -geometry 200% -blur 0x0.5 \
       -morphology erode square:1 -geometry 50% \) \
    -compose CopyOpacity -composite -shave 1 outputfilename.png

解释

这比之前给出的简单答案要长一些, 但它提供了更多更好的结果:(1)质量优越到期 抗锯齿alpha,和(2)背景被删除为 反对单一颜色。 (“背景”定义为近似 与左上角像素相同的颜色,使用来自的左侧填充 图片边缘。)

此外,alpha通道也被半个像素侵蚀以避免光晕。当然,ImageMagick的形态操作不会(但是?)在亚像素级别工作,所以你可以看到我在侵蚀之前将alpha通道炸成200%。

结果比较

这是简单方法的比较(“-fuzz 2%-transparent 白色“)对比我的解决方案,当运行时 ImageMagick logo。我已经扁平化了 两个透明的图像到马鞍棕色背景上,使 差异明显(点击原件)。

The simple replacement of white as transparent doesn't always work Antialiased alphachannel and floodfill looks much better

注意向导的胡子在简单的方法中是如何消失的。 比较向导的边缘,看看反锯齿alpha的帮助 图形平滑地融入背景中。

当然,我完全承认有时您可能希望使用 更简单的解决方案。 (例如:这更容易了 记住,如果你转换为GIF,你只能限制在1位 无论如何,alpha。)

mktrans shell脚本

因为你不太可能想要反复输入这个命令,我 建议将其包装在脚本中。你可以download a BASH shell script from github哪个 执行我建议的解决方案它可以在a中的多个文件上运行 目录并包含有用的注释,以备不时之需 调整事物。

bg_removal脚本

顺便说一句,ImageMagick实际上附带了一个名为的脚本 "bg_removal" 它以与我的解决方案类似的方式使用floodfill。然而 结果不是很好,因为它仍然使用1位alpha。而且, bg_removal脚本运行速度较慢,使用起来有点棘手(它 要求您指定两个不同的模糊值)。这是bg_removal输出的一个例子。

The bg_removal script: has beard, but lacks antialiasing

答案 3 :(得分:25)

这对我有用:

convert original.png -fuzz 10% -transparent white transparent.png

其中模糊%越小,越接近真白色或相反,%越大,白色变化越大变得透明

答案 4 :(得分:11)

您可以使用此选项使背景透明

convert test.png -background rgba(0,0,0,0) test1.png

上面给出了完美的透明背景

答案 5 :(得分:5)

使用ImageMagick,这与hackerb9代码和结果非常相似,但命令行更简单一些。它确实假设左上角的像素是背景颜色。我只是用透明度填充背景,然后选择alpha通道并模糊它并使用-level 50x100%移除一半模糊区域。然后转回所有通道并将其压平成棕色。 -blur 0x1 -level 50x100%用于对alpha通道透明度的边界进行抗锯齿处理。您可以调整模糊值,模糊量和-level 50%值来更改抗锯齿的程度。

convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg

enter image description here

答案 6 :(得分:4)

如果要控制透明度,可以使用rgba。其中a是alpha。 0表示透明,1表示不透明。确保最终输出文件的透明度必须为.png扩展名。

convert 
  test.png 
    -channel rgba 
    -matte 
    -fuzz 40% 
    -fill "rgba(255,255,255,0.5)" 
    -opaque "rgb(255,255,255)" 
       semi_transparent.png

答案 7 :(得分:1)

是的。也有同样的问题。这是我运行的命令,它完美运行: convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico