Android 中的 HDR 屏幕截图

自从高动态范围 (HDR) 视频推出以来,在线影音服务已开始支持在线播放 HDR 视频,并专注于全屏体验。最近,社交媒体应用已开始支持 HDR 视频和 Ultra HDR,这表明用户对在各种应用中采用 HDR 越来越感兴趣。

Android 对 HDR 的支持

以下是 Android 多年的 HDR 技术支持里程碑:

Android 7

  • 初步支持 HDR 视频解码和显示。
  • HDR 功能不断改进。

Android 13

  • 对 HDR 视频拍摄、编码和显示的端到端支持。
  • 推出了混合 SDR 和 HDR 组合,以便在 SDR 和 HDR 之间定义不同的可显示亮度范围。

Android 14

多年来,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
    Android 14 中的示例 1 Android 15qpr 中的示例 1

    图 1. 示例 1 的 Android 14 与 Android 15-QPR1 的比较。

  • 示例 2 是设置前面叠加的 HDR 视频的屏幕截图,以及后续屏幕截图。在 Android 14 中,屏幕截图的颜色会逐渐变暗。在 Android 15-QPR1 中,色调映射器会正确复制和保留界面颜色。

    Android 14 Android 15-QPR1
    Android 14 中的示例 2 Android 15qpr 中的示例 2

    图 2. 示例 2 中 Android 14 和 Android 15-QPR1 的比较。