首页 > 解决方案 > ffmpeg 将白色转换为 alpha

问题描述

你好,我用我的相机拍了一张照片:一张白纸上的方框图;我正在尝试将白色转换为透明并保留黑色框架。

所以我开始制作 1 个只有 2 种颜色的调色板以使颜色均匀,并用 1 个调色板添加透明度

ffmpeg -f lavfi -i "color=color=white:100x100" -f lavfi -i "color=color=black:100x100" -filter_complex "[0][1]hstack" -frames:v 1 blackwhite.png`
ffmpeg -i blackwhite.png -filter_complex "[0]split[a][b];[a]palettegen[pal1];[b]palettegen=reserve_transparent=on:transparency_color=white[pal2]" -map [pal1] palette1.png -map [pal2] palette2.png

然后我映射框架的图像 png 以将白色转换为透明并将结果覆盖到红色背景

ffmpeg -i image.png -i palette1.png -i palette2.png -i background.png -filter_complex "[0:v][1:v]paletteuse=dither=bayer[a],[a]split[a1][a2];[a1][2:v]paletteuse=alpha_threshold=128[c];[3:v][c]overlay[d]" -map [a2] -c:v png out.png -map [d] -c:v png out1.png

映射到第一个调色板的png(作为测试)应该是纯黑色和白色,第二个完全没有透明度并覆盖了背景我做错了什么?

标签: ffmpegtransparencyalphapalette

解决方案


好的,我想出了一个使用 alpha 合并过滤器的方法,不需要第二个允许透明的调色板。

所以我开始简单

ffmpeg -i image.png -i palette.png -filter_complex "paletteuse=dither=bayer" image2colors.png
ffmpeg -i background.png -i image2colors.png -filter_complex "alphamerge" out.png

将整个图像转换为 alpha 通道(黑色和白色都是透明的)

ffmpeg -i image2colors.png -i background.png -filter_complex "[0]split[a][b];[a][b]alphamerge[c];[1][c]overlay[d]" -map [d] out.jpeg

这样可以保持白色并使绘图的黑色透明,当覆盖时变成红色,白色也不再那么明亮,就像它有一种透明度

这解决了这个问题

ffmpeg -i image2colors.png -i background.png -filter_complex "[0]split[a][b];[a]negate[n];[b][n]alphamerge[c];[1][c]overlay[d]" -map [d] out.jpeg

这给了我一个完美的黑色框架,覆盖在彩色背景上的 alpha 通道上。(jpeg 显示覆盖已经正确)似乎 alpha 合并选择了黑色而不是白色。我发布了我所有的错误,因为我通过尝试做到了,但我仍然不知道我在做什么。如果有人有更优雅的方式来获得这个结果,请回答我很多细节。


推荐阅读