我正在尝试以伽马校正方式缩放 RGB 图像,即在缩放器之前和之后进行伽马变换。由于 8 位/通道的伽马校正会产生“条带”,因此我首先将图像转换为 16 位/通道 (gbrp16le),然后在一切完成后再转换回 rgb24。
问题是,这个过程不知何故导致了不准确的颜色:而不是黑色(rgb0,0,0)我得到了深紫色(RGB25,0,27)。
我的命令行(Windows 批处理,因此 ^ 字符转义双引号和换行符):
ffmpeg -loglevel 42 -hide_banner -y -i testcase.png -vf ^"^
format=gbrp16le,^
lutrgb='r=gammaval(2.2):g=gammaval(2.2):b=gammaval(2.2)',^
scale=iw/2:ih/2:flags=bicubic,^
lutrgb='r=gammaval(0.454545):g=gammaval(0.454545):b=gammaval(0.454545)',^
format=gbrp16le,^
format=rgb24^" ^
testcase-out.png
(第二个format=gbrp16le
原因是缩放器本身似乎会转换为 rgb24,并在第二次伽马变换后给我带来带状)
示例输入“testcase.png”-条形周围的黑色区域是 rgb0,0,0:
输出结果如下。可能很难看清,但如果你实际检查一下颜色值,黑色现在变成了25,0,27 (#19001B):
在这个日志级别,我还获得了有关过滤器图正在做什么的以下详细信息:
[Parsed_scale_2 @ 0000000002c90340] w:iw/2 h:ih/2 flags:'bicubic' interl:0
[graph 0 input from stream 0:0 @ 000000000019d200] w:420 h:212 pixfmt:rgb24 tb:1/25 fr:25/1 sar:0/1
[auto_scaler_0 @ 00000000001aa4c0] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_0 @ 00000000006f8f00] auto-inserting filter 'auto_scaler_0' between the filter 'graph 0 input from stream 0:0' and the filter 'Parsed_format_0'
[auto_scaler_1 @ 00000000001aa5c0] w:iw h:ih flags:'bicubic' interl:0
[Parsed_format_5 @ 000000000019cf80] auto-inserting filter 'auto_scaler_1' between the filter 'Parsed_format_4' and the filter 'Parsed_format_5'
[auto_scaler_0 @ 00000000001aa4c0] w:420 h:212 fmt:rgb24 sar:0/1 -> w:420 h:212 fmt:gbrp16le sar:0/1 flags:0x4
[Parsed_scale_2 @ 0000000002c90340] w:420 h:212 fmt:gbrp16le sar:0/1 -> w:210 h:106 fmt:gbrp16le sar:0/1 flags:0x4
[auto_scaler_1 @ 00000000001aa5c0] w:210 h:106 fmt:gbrp16le sar:0/1 -> w:210 h:106 fmt:rgb24 sar:0/1 flags:0x4
有线索吗?如何解决这个问题?
我已经尝试过一些方法:
- 添加其他缩放器标志(accurate_rnd、full_chroma_int、full_chroma_inp、bitexact)
- 更改
src_range
缩放dst_range
器选项,以防万一是“完整”与“有限”问题(尽管绿色通道不受影响) - 从输入 .png 中删除 ICC 配置文件
- 更改
gbrp16le
为其他像素格式(>8 位/通道),例如gbrp10le
- 使用不同的缩放算法(例如 lanczos、邻居)
以上都无济于事……
答案1
我已经更新了我的 FFmpeg 版本并且问题已经消失 —— 显然这个错误在过去 2 个月内的某个时间已经得到修复。
(之前的版本是4.3.1-2020-11-19,当前版本是2021-01-12-git-ca21cb1e36)