假设您有任何图像(PNG 或 JPG)。此图像具有白色背景,我需要使此背景透明。
我试过这些例子:
转换 original.png -背景无透明.png
转换 original.png -background white -flatten -alpha off transparent.png
但没有理想的结果。
我怎样才能做到?
重要提示:使用 convert
命令行。
convert original.png -transparent white new.png
但在尝试后,无法让它工作。顺便说一句,您确定您的背景实际上是白色的(#FFFFFF),还是几乎是白色的(例如#FEFEFE)?
我在 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
mogrify -format png -median 2 -fuzz 5% -transparent white ico_*.jpg
解决方案
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”)与我的解决方案的比较。我已将两个透明图像展平到马鞍棕色背景上,以使差异明显(点击查看原件)。
https://i.imgur.com/V0JNRKN.png
注意巫师的胡须在简单的方法中是如何消失的。比较向导的边缘,了解抗锯齿 alpha 如何帮助图形平滑地融入背景。
当然,我完全承认有时您可能希望使用更简单的解决方案。 (例如:它更容易记住,如果你要转换为 GIF,无论如何你都被限制为 1 位 alpha。)
mktrans 外壳脚本
由于您不太可能想要重复输入此命令,因此我建议将其包装在脚本中。您可以download a BASH shell script from github执行我建议的解决方案。它可以在一个目录中的多个文件上运行,并包含有用的注释,以防你想调整一些东西。
bg_removal 脚本
顺便说一句,ImageMagick 实际上带有一个名为 "bg_removal" 的脚本,它以与我的解决方案类似的方式使用洪水填充。但是,结果并不好,因为它仍然使用 1 位 alpha。此外,bg_removal 脚本运行速度较慢并且使用起来有点棘手(它需要您指定两个不同的模糊值)。这是 bg_removal 的输出示例。
https://i.imgur.com/BYb8rxR.png
gimp
或其他任何地方手动执行此操作。 :)
这对我有用:
convert original.png -fuzz 10% -transparent white transparent.png
其中 fuzz % 越小,越接近真正的白色,反之,% 越大,允许的白色变化越多,变得透明
您可以使用它使背景透明
convert test.png -background rgba(0,0,0,0) test1.png
以上给出了完美的透明背景
()
进行一些引用:convert more-icon.png -gravity center -background 'rgba(0,0,0,0)' -extent 27x27 new-more-icon.png
-transparent SOMECOLOR
中使用的任何颜色的情况)
使用 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
https://i.stack.imgur.com/HN4BU.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
convert test.png -transparent "#ffffff" transparent.png