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

假设你有任何图像(PNG或JPG)。 这个图像有一个白色的背景,我需要使这个背景透明。

我已经尝试过这些例子:

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

但没有理想的结果。

我怎样才能做到这一点?

重要:使用convert命令行。

我在Ubuntu 12.04上使用ImageMagick 6.6.9-7。
对我有效的是以下几点:

 convert test.png -transparent white transparent.png 

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

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

对我有效的是:

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

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

这适用于我:

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

其中,模糊%越小,越接近真实的白色,或者相反,%越大,则允许白色越变得透明

您可以使用此来使背景透明

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

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

 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)由于抗锯齿阿尔法,质量是优越的,并且(2) 仅仅背景被去除而不是单一颜色。 (“背景”被定义为与左上像素大致相同的颜色,使用来自图像边缘的填充。)

此外,alpha通道也被腐蚀了半个像素以避免光晕。 当然,ImageMagick的形态操作在子像素级上还不行(所以呢),所以你可以看到我在将alpha通道吹到200%之前就被侵蚀了。

结果比较

在ImageMagick徽标上运行时,下面是简单方法(“-fuzz 2%-transparent white”)与我的解决scheme的比较。 我已经将两个透明图像拼合成马鞍棕色的背景,以使差异显而易见(点击原始图片)。

将白色简单替换为透明并不总是可行 Antialiased alphachannel和floodfill看起来好多了

注意巫师的胡子如何以简单的方式消失。 比较向导的边缘,看看antialiased alpha如何帮助graphics平滑地融入背景。

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

mktrans shell脚本

由于不太可能要重复input此命令,所以我build议将其封装在脚本中。 你可以从github下载一个BASH shell脚本来执行我build议的解决scheme。 它可以运行在一个目录中的多个文件,并包括有用的意见,以防止你想调整的东西。

bg_removal脚本

顺便说一句,ImageMagick实际上带有一个名为“bg_removal”的脚本,它以与我的解决scheme类似的方式使用填充。 但是,结果并不是很好,因为它仍然使用1位的阿尔法。 此外,bg_removal脚本运行速度较慢,使用起来有点麻烦(它要求您指定两个不同的模糊值)。 这是bg_removal输出的一个例子。

bg_removal脚本:有胡子,但没有抗锯齿

如果你想控制透明度,你可以使用rgba。 其中a是阿尔法。 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 

使用ImageMagick,这与hackerb9代码和结果非常相似,但是是一个简单的命令行。 它假定左上angular的像素是背景颜色。 我只是用透明度填充背景,然后selectalpha通道并使其模糊,并使用-50的水平50%100%去除模糊区域的一半。 然后重新打开所有的通道并将其压平成棕色。 -blur 0x1 -level 50×100%用于抗锯齿Alpha通道透明度的边界。 您可以调整模糊值,模糊量和“50%”值以改变抗锯齿的程度。

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

在这里输入图像说明

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