为何FFmpeg的screen混合模式与GIMP/Photoshop效果不符?
FFmpeg Screen混合模式与GIMP/Photoshop结果不一致的原因及解决办法
问题背景
将前景素材(皮卡丘)以Screen混合模式叠加到背景素材(黑底白圆)上时,GIMP和Adobe Photoshop的处理结果为圆形呈白色,预期效果如下:
使用以下输入素材:
- 背景素材(黑底白圆):

- 前景素材(皮卡丘):

执行FFmpeg正序混合命令:
ffmpeg -i circle_rgb_50.png -i pikachu_rgb.png -filter_complex "[0:v][1:v]blend=screen" pikachu_screened_over_circle_rgb_just_blend.png
得到结果:
反转输入顺序执行命令:
ffmpeg -i circle_rgb_50.png -i pikachu_rgb.png -filter_complex "[1:v][0:v]blend=screen" pikachu_screened_over_circle_rgb_just_blend_other_way_around.png
得到结果:
原因
FFmpeg的blend=screen滤镜默认在线性RGB色彩空间下计算混合,而GIMP、Photoshop默认使用sRGB色彩空间(带gamma校正)执行混合模式。色彩空间的差异导致像素值计算逻辑不同,最终视觉效果出现偏差。
解决方案
需在混合前后加入色彩空间转换,强制在sRGB空间下执行Screen混合,命令如下:
ffmpeg -i circle_rgb_50.png -i pikachu_rgb.png -filter_complex "[0:v]colorspace=trc=srgb[bg];[1:v]colorspace=trc=srgb[fg];[bg][fg]blend=screen[v];[v]colorspace=trc=linear" pikachu_screened_correct.png
也可简化为:
ffmpeg -i circle_rgb_50.png -i pikachu_rgb.png -filter_complex "[0:v][1:v]colorspace=trc=srgb,blend=screen,colorspace=trc=linear" pikachu_screened_correct.png
原理说明
Screen混合的核心公式是 结果 = 1 - (1 - 背景) * (1 - 前景)。sRGB空间的像素值经过gamma≈2.2的校正,线性RGB则是原始的亮度值,两者的数值范围和计算逻辑不同。通过转换到sRGB空间执行混合,就能和GIMP/Photoshop的计算逻辑对齐,得到预期效果。
内容的提问来源于stack exchange,提问作者OneWorld
相关产品推荐
相关产品推荐

