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

SurfaceFlinger(Android 的图形合成器)引入了 HDR 视频支持。HDR 视频和屏幕截图的 GPU 渲染通过复杂的 polynomial 色调映射器获得支持。此色调映射曲线并不总是等同于显示色调映射器,因此屏幕截图与屏幕内容有所不同。

Android 13

一个色调映射插件被添加到 SurfaceFlinger 的 GPU 渲染块,使 OEM 能够提供 GPU 着色器以匹配其显示器的色调映射曲线。屏幕截图几乎与屏幕上的内容匹配,但存在以下差异

  • 屏幕截图仍为 SDR 格式。因此,当与 HDR 场景一起查看时,屏幕截图中的 HDR 区域显得较暗。
  • SDR 亮度未得到管理,导致屏幕截图中的 SDR 内容看起来与 HDR 内容一样明亮。

换句话说,屏幕截图中捕获的任何 HDR 视频都会转换为 SDR 视频。

Android 14

Ultra HDR 对屏幕截图提出了重大挑战。与视频不同,图像通常在 UI 帧缓冲区中渲染,这有两个主要含义

  • 图像不能进行与周围 UI 不同的图像处理,包括色调映射。
  • 在渲染其 UI 时,应用负责基于源的色调映射。

为了缓解这一挑战,有三种可能的屏幕截图实现方式

  • 保留 Ultra HDR 图像的 HDR 细节,导致屏幕截图中的应用 UI 变暗。
  • 保留应用 UI 细节,导致 Ultra HDR 图像剪切。
  • 通过调亮应用 UI 同时剪切 HDR 高光来做出妥协。

Android 14 实现了第三种方法,即调亮应用 UI 并剪切 HDR 高光。

Android 15-QPR1

SurfaceFlinger 包含用于屏幕截图的本地色调映射算法。此过程包括

  • 将输入图像划分为更小的图像。
  • 计算每个图像中的最大亮度,并丢弃每个部分中的低亮度值。
  • 通过模糊和重采样来插值计算出的亮度。
  • 基于插值亮度值,将参数化的 Reinhard 色调映射器应用于输入图像。

此算法显示了 Android 14 和 Android 15-QPR1 之间屏幕截图的显着改进,如下列示例所示

  • 示例 1 是 HDR 视频叠加在包含 Ultra HDR 的 Chrome 页面顶部的屏幕截图。UI 颜色在新的实现中基本得到保留,并且图像不再被剪切。

    Android 14 Android 15-QPR1
    Example 1 in Android 14 Example 1 in Android 15qpr

    图 1. 示例 1 的 Android 14 和 Android 15-QPR1 对比。

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

    Android 14 Android 15-QPR1
    Example 2 in Android 14 Example 2 in Android 15qpr

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