大多数人拍摄安卓截图的原因是为了与他人分享他们看到的内容,安卓系统对此能够轻松处理。直到最近,安卓并不需要支持拍摄HDR截图,因为我们访问的大多数内容都是SDR(标准动态范围)格式。然而,随着HDR内容越来越流行,人们不可避免地会拍摄包含HDR元素的截图。幸运的是,谷歌终于在今年的Android 16版本中加入了对HDR截图的支持。

什么是HDR?
HDR(高动态范围)指的是具有比标准动态范围(SDR)内容更广泛亮度和色彩范围的图像或视频。结果是更加真实的视觉效果,具有更亮的高光、更深的阴影和更多细节,使图像看起来更具生命力。基本上,HDR旨在捕捉并显示更广泛的明暗色调,更接近我们眼睛在现实世界中的感知。
为了显示HDR内容,设备需要支持比相对有限的sRGB标准更广泛色域的HDR显示屏。虽然一些现代安卓手机和平板电脑配备了HDR显示屏,但大多数内容仍然是SDR格式的。
关键的是,即使在这些设备上拍摄的HDR内容截图,目前也会保存为SDR格式。这是因为安卓在编码截图时没有保留额外的色彩信息;在SDR截图格式的编码过程中,HDR内容中的附加色彩信息会丢失。
随着Android 13引入端到端的HDR视频支持,谷歌不得不更新安卓的截图算法,以便截图几乎与屏幕上显示的内容匹配。然而,由于截图仍然是SDR格式,截图中的HDR区域会显得更暗,而SDR内容则会像HDR内容一样明亮。
Android 14进一步增加了复杂性,通过引入对HDR图像的支持,即超高清HDR(Ultra HDR)。由于HDR图像通常显示在SDR应用程序UI中,谷歌不得不设计一种方法,将SDR UI和HDR图像编码到同一张SDR截图中。由于截图仍然是SDR格式,谷歌的解决方案是增加应用UI的亮度并裁剪HDR高光。最终的结果是,截图并不能真正捕捉到你实际看到的内容。


第一张图:一张HDR视频截图,叠加在包含超高清HDR的Chrome页面上。右图:一张HDR视频截图,叠加在设置应用上,并附带后续截图。这两张截图均在Android 14上拍摄。来源:谷歌。
安卓截图中的HDR
在Android 15 QPR1中,操作系统引入了一种用于HDR截图的本地色调映射算法。这个算法不仅能保留UI颜色,还能防止HDR高光被裁剪,从而显著改善了HDR内容截图的效果。即便有了这种改进,截图仍然是SDR格式,无法在HDR显示器上展现完整的效果。


第一张图:一张HDR视频截图,叠加在包含超高清HDR的Chrome页面上。右图:一张HDR视频截图,叠加在设置应用上,并附带后续截图。这两张截图均在Android 15 QPR1上拍摄,该版本使用了色调映射器来保留UI颜色和HDR高光。来源:谷歌。
最后,谷歌正在Android 16中实现对真正HDR截图的支持。在Android 16 Beta 2中,我发现HDR内容的截图已保存为HDR格式。当我在Pixel手机上的照片应用中查看这些截图时,我立刻看到屏幕亮度提高,HDR高光开始突出。我通过比较在更新Pixel 7 Pro到Android 16 Beta 2之前和之后拍摄的同一HDR图像截图,确认了这一点。更新前的截图是SDR格式,而更新后的截图是HDR格式。
通过查看安卓源代码,我发现了多个关于“真正HDR截图”功能的引用,这些引用出现在SurfaceFlinger中,SurfaceFlinger是安卓中负责屏幕渲染的重要系统服务。当“真正HDR截图”功能启用时,HDR内容可以被截图,而无需进行色调映射。
显示分析师Dylan Raga和GitHub用户ledoge检查了Android 16生成的HDR截图,并确认这些截图是包含HDR增益图的PNG文件。大多数常规工具无法检测到这些增益图,但一个专业的PNG检查工具能够检测到它们。这些增益图使得截图在Android 16设备上以HDR显示,但在其他设备上则显示为SDR。
目前尚不清楚为什么谷歌选择PNG格式来保存HDR截图,而不是使用Ultra HDR支持的格式,如JPEG。或许他们想避免潜在的JPEG压缩伪影,尤其是在裁剪时。希望谷歌能够正式分享更多关于安卓16中HDR截图如何工作的细节,这样我们可以更好地了解如何在设备间共享这些截图。