假设您有任何图像(PNG或JPG)。 这张图片有白色背景,我需要让这个背景透明。
我尝试过这些例子:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
但没有令人满意的结果。
我该怎么做?
重要提示:使用convert
命令行。
答案 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。我已经扁平化了 两个透明的图像到马鞍棕色背景上,使 差异明显(点击原件)。
注意向导的胡子在简单的方法中是如何消失的。 比较向导的边缘,看看反锯齿alpha的帮助 图形平滑地融入背景中。
当然,我完全承认有时您可能希望使用 更简单的解决方案。 (例如:这更容易了 记住,如果你转换为GIF,你只能限制在1位 无论如何,alpha。)
因为你不太可能想要反复输入这个命令,我 建议将其包装在脚本中。你可以download a BASH shell script from github哪个 执行我建议的解决方案它可以在a中的多个文件上运行 目录并包含有用的注释,以备不时之需 调整事物。
顺便说一句,ImageMagick实际上附带了一个名为的脚本 "bg_removal" 它以与我的解决方案类似的方式使用floodfill。然而 结果不是很好,因为它仍然使用1位alpha。而且, bg_removal脚本运行速度较慢,使用起来有点棘手(它 要求您指定两个不同的模糊值)。这是bg_removal输出的一个例子。
答案 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
答案 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