假设您有任何图像(PNG 或 JPG)。此图像具有白色背景,我需要使此背景透明。
我试过这些例子:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
但没有理想的结果。
我怎样才能做到?
重要提示:使用convert
命令行。
假设您有任何图像(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
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%。
这是在ImageMagick logo上运行时简单方法(“-fuzz 2% -transparent white”)与我的解决方案的比较 。我已将两个透明图像展平到马鞍棕色背景上,以使差异明显(点击查看原件)。
注意巫师的胡须在简单的方法中是如何消失的。比较向导的边缘,了解抗锯齿 alpha 如何帮助图形平滑地融入背景。
当然,我完全承认有时您可能希望使用更简单的解决方案。(例如:它更容易记住,如果你要转换为 GIF,无论如何你都被限制为 1 位 alpha。)
由于您不太可能想要重复输入此命令,因此我建议将其包装在脚本中。您可以从 github 下载执行我建议的解决方案的 BASH shell 脚本。它可以在一个目录中的多个文件上运行,并包含有用的注释,以防你想调整一些东西。
顺便说一句,ImageMagick 实际上带有一个名为 “bg_removal”的脚本 ,它以与我的解决方案类似的方式使用洪水填充。但是,结果并不好,因为它仍然使用 1 位 alpha。此外,bg_removal 脚本运行速度较慢并且使用起来有点棘手(它需要您指定两个不同的模糊值)。这是 bg_removal 的输出示例。
这对我有用:
convert original.png -fuzz 10% -transparent white transparent.png
其中 fuzz % 越小,越接近真正的白色,反之,% 越大,允许的白色变化越多,变得透明
您可以使用它使背景透明
convert test.png -background rgba(0,0,0,0) test1.png
以上给出了完美的透明背景
使用 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
如果要控制透明度级别,可以使用 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
是的。也有同样的问题。这是我运行的命令,它运行良好:
convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico