自从高动态范围 (HDR) 视频推出以来,在线影音服务已开始支持在线播放 HDR 视频,并专注于全屏体验。最近,社交媒体应用已开始支持 HDR 视频和 Ultra HDR,这表明用户对在各种应用中采用 HDR 越来越感兴趣。
Android 对 HDR 的支持
以下是 Android 多年的 HDR 技术支持里程碑:
Android 7
- 初步支持 HDR 视频解码和显示。
- HDR 功能不断改进。
Android 13
- 对 HDR 视频拍摄、编码和显示的端到端支持。
- 推出了混合 SDR 和 HDR 组合,以便在 SDR 和 HDR 之间定义不同的可显示亮度范围。
Android 14
- 支持采用 Ultra HDR 的 HDR 图片。
多年来,HDR 屏幕截图支持也在不断发展,并经历了许多变化。
HDR 屏幕截图功能的改进
本部分记录了近期 Android 更新中对 HDR 屏幕截图功能进行的改进。
Android 9
Android 的图形合成器 SurfaceFlinger 引入了对 HDR 视频的支持。借助复杂的多项式色调映射器,支持对 HDR 视频和屏幕截图进行 GPU 渲染。此色调映射曲线并不总是等同于显示屏色调映射器,因此屏幕截图与屏幕上的内容会有所不同。
Android 13
为 SurfaceFlinger 的 GPU 渲染块添加了一个色调映射插件,以便 OEM 提供 GPU 着色器来匹配其显示屏的色调映射曲线。屏幕截图与屏幕上的内容几乎一致,但存在以下差异:
- 屏幕截图仍会采用 SDR 格式。因此,当与 HDR 场景一起显示时,屏幕截图中的 HDR 区域会显得更暗。
- 未对 SDR 亮度进行管理,这导致屏幕截图中的 SDR 内容看起来与 HDR 内容的亮度相同。
换句话说,屏幕截图中捕获的任何 HDR 视频都会转换为 SDR 视频。
Android 14
Ultra HDR 给屏幕截图带来了重大挑战。与视频不同,图片通常在界面帧缓冲内渲染,这有两个主要影响:
- 图片的图片处理(包括色调映射)不得与周围界面不同。
- 在呈现界面时,应用负责基于来源进行色调映射。
为了应对这一挑战,目前推出了三种可能的屏幕截图实现方式:
- 保留 Ultra HDR 图片的 HDR 细节,这会导致屏幕截图中的应用界面变暗。
- 保留应用界面细节,这会导致 Ultra HDR 图片被裁剪。
- 折衷方案:在亮化应用界面的同时剪裁 HDR 亮点。
Android 14 实现了第三种方法,即调亮应用界面并剪裁 HDR 高光区域。
Android 15-QPR1
SurfaceFlinger 包含适用于屏幕截图的本地色调映射算法。此过程包括:
- 将输入图片划分为较小的图片。
- 计算每个图片中的最大亮度,并舍弃每个部分中的低亮度值。
- 通过模糊处理和重新采样对计算出的亮度进行插值处理。
- 根据插值处理后的亮度值,将参数化 Reinhard 色调映射器应用于输入图片。
此算法能够在 Android 14 和 Android 15-QPR1 之间实现显著的屏幕截图改进,如下例所示:
示例 1 是 Chrome 网页前面叠加的包含 Ultra HDR 的 HDR 视频的屏幕截图。新实现中保留了大部分界面颜色,并且图片不再被剪裁。
Android 14 Android 15-QPR1 图 1. 示例 1 的 Android 14 与 Android 15-QPR1 的比较。
示例 2 是设置前面叠加的 HDR 视频的屏幕截图,以及后续屏幕截图。在 Android 14 中,屏幕截图的颜色会逐渐变暗。在 Android 15-QPR1 中,色调映射器会正确复制和保留界面颜色。
Android 14 Android 15-QPR1 图 2. 示例 2 中 Android 14 和 Android 15-QPR1 的比较。