使用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 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输出的一个例子。
如果你想控制透明度,你可以使用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