石家庄建设银行网站,深圳创业补贴申请条件,替换wordpress网址,wordpress5.0.3下载一、什么是Ultra HDR Image 2023年10月初#xff0c;google正式发布了Android 14。该版本中引入了一个新的功能Ultra HDR Image#xff0c;被誉为”图像技术的未来”。之前Android版本各手机厂商或许有自己的HDR图片技术#xff0c;本文这里重点分析下Android14上google的实… 一、什么是Ultra HDR Image 2023年10月初google正式发布了Android 14。该版本中引入了一个新的功能Ultra HDR Image被誉为”图像技术的未来”。之前Android版本各手机厂商或许有自己的HDR图片技术本文这里重点分析下Android14上google的实现方案。 让我们先来看一组图片。上图中左边的图片为SDR标准动态范围右边的图片为HDR高动态范围。显而易见HDR图片更加的生动鲜艳画面层次感表现的更为突出。Ultra HDR Image功能就是为用户提供了拍摄、查看HDR照片的功能。 Google Ultra HDR Image实际是使用两个8-bit位深的JPEG来还原真实拍摄场景的高动态范围。本文将此文件格式称为JPEG-R该格式向后兼容JPEG。 二、Ultra HDR Image文件结构 Ultra HDR Image文件是基于传统JPEG文件格式通过附加的metadata 信息及Gainmap图最大程度上保留了拍摄场景的动态范围。 图2.1 - Ultra HDR Image 文件结构 前面讲到Ultra HDR Image是由两个JPEG文件组成。其中第一个JPEG称为Primary image(主图)是一张普通的8bit SDR图片存储着SDR图像数据。第二个JPEG称为Gainmap增益图Gainmap图存储着足以恢复原始高动态亮度的数据可以简单理解为每个像素点处的亮度差。支持该格式的设备会将主图和增益图结合起来在兼容的显示器上渲染出高动态范围的图像。 图2.1中绿色部分为Google GContainer遵循XMP规范并嵌入到主图文件中其格式为RDF/XML。 图2.2- Google GContainer 如图2.2所示主图像在XMP中包含了Container:Directory元素定义文件容器中后续媒体文件的顺序和属性。容器中每个文件在Container:Directory中都有一个相应的媒体项媒体项描述文件容器中的位置及每个串联文件的基本属性。 图2.2 GContainer说明该图片有1个Primary图和1个Gainmap图两个文件均为“image/jpeg”格式Gainmap图文件长度为66171字节。 图2.1中红色部分为HDR Gain map metadata. 这部分数据说明了如何使用Gainmap图将主图像渲染到高动态范围。 图2.3- HDR Gain map metadata 上表中GainMapMin和GainMapMax是图像内容上像素值的增益范围取决于图像内容。而HDRCapacityMin和HDRCapacityMax是显示时提升的增益范围取决于显示设备和其他因素。XMP中存储的这几个值都是经过对数转换的。可能有人会问为什么需要对数转换这样有什么好处呢这里就不得不提一个概念”压缩范围”。在摄影中现实世界场景的动态范围通常比 SDR 显示器所能呈现的动态范围更大。需要诸如范围压缩也称为局部色调映射之类的操作来减少图像的动态范围。减小图像中最大亮度边缘的大小同时尽可能保留小亮度边缘(细节)的大小。如图2.4对数曲线在像素值较低的区域斜率大在像素值较高的区域斜率小。所以对数变换可以将图像低亮部分进行扩展保留更多的细节高亮部分压缩减少高亮部分的细节。 图2.4- 对数曲线 图2.1中紫色部分为MPF数据储存在主图像中App2字段主要包含了文件容器中Primary图和Gainmap图的偏移及文件长度。 图2.5- MPF 三、Ultra HDR Image编码 Android14上针对不同的场景共提供了5个编码接口用来生成Ultra HDR Image。 图3.1- API-0 图3.2- API-1 图3.3- API-2 图3.4- API-3 图3.5- API-4 调用方根据需要选择其中一个即可。在这里我们以API-0为例详细剖析下编码流程。 图3.6- API-0编码流程 JPEG-R编码主要有以下5个步骤 a.相机Hal采集到HDR数据(P010)通过tonemap函数生成SDR数据YUV420 b. 通过HDR数据和SDR数据生成未压缩的gain map(亮度差)数据 c. gain map数据压缩成单通道JPEG文件(灰度图) d. SDR数据压缩成Primary JPEG图 e.生成metadata信息并将gainmap灰度图添加到Primary JPEG后面 上面5步中c、d均为普通jpeg编码e为文件流输出这里就不在赘述。我们重点结合代码分析下前两步 a.HDR-SDR: 从下图代码中可以看出tonemap操作实际是将每个像素点处的P010数据通过右移2位的操作从10-bit映射到了8-bit范围生成新的SDR数据YUV420。 图3.7- P010数据tonemap到YUV420代码 b. Gain map亮度差数据生成: 图3.8- gainmap 亮度差生成代码 sampleYuv420()函数是获取xy)坐标处归一化后的yuv数据。 图3.9- sample420函数 srgbYuvToRgbFn()是通过公式将归一化得yuv数据转成rgb数据需要注意得是这里的rgb数据是经过gamma编码的非线性数据。这里以P3色域的图片为例 图3.10- srgbYuvToRgbFn函数 srgbInvOetfLUT()是通过光电转换函数将非线性的rgb数据转换成线性rgb数据。 图3.11- srgbInvOetfLUT函数 luminanceFn()是将归一化的线性rgb数据转换成对应的亮度值在0.0到1.0的范围内。该值乘以kSdrWhiteNits表示的是(x,y)坐标处标准动态范围主图像的线性亮度这里暂时用Ysdr(x,y)表示。 图3.12- luminanceFn函数 同理根据P010数据可以计算出(x,y)处高动态范围图像的线性亮度用Yhdr(x,y)表示。 根据(x,y)处的标准动态范围主图像线性亮度Ysdr(x,y)和高动态范围图像的线性亮度Yhdr(x,y)通过encodeGain函数生成(x,y)处的亮度差并恢复到0~255范围。 图3.13- encodeGain函数 所有像素点处的亮度差获取到后编码成单通道的JPEG灰度图存储在primary JPEG文件后面。以上就是Native层Ultra HDR Image生成的全部过程。 下面通过一个简单的例子告诉你上层应用如何编码JPEG-R格式。 图3.14- 上层应用编码实例 四、Ultra HDR Image解码 JPEG-R解码流程如下图所示 图4.1- JPEG-R解码流程 JPEG-R格式图片解码时首先解码primary JPEG(主图)然后判断该图片是否遵循JPEG-R格式标准包含Gainmap图。如果有则解码Gainmap图并将gainmap存入主图Bitmap结构体中。代码如下 图4.2- JPEG-R解码流程 图4.2中getAndroidGainmap函数解析图片是否符合JPEG-R格式标准。如果是JPEG-R继续解析获取XMP文件中gainmap图的metadata信息保存在gainmapInfo中。同时保存出gainmap数据流。decodeGainmap函数负责解码上一步获取到的gainmap数据流并将解码后的数据保存在gainmap参数中。最后通过setGainmap函数将gainmap数据保存到主图bitmap结构体中。Primary JPEG和Gainmap图的解码都是基本的jpeg解码流程这里就不在赘述了。 以上就是Native层Ultra HDR Image的解码过程。下面一个例子告诉你上层应用该如何获取Gainmap数据: 五、Ultra HDR Image渲染 JPEG-R渲染时每个坐标点的像素通过HDR/SDR ratio(亮度差)数据, 将标准动态范围数据还原到高动态范围。 这里的f可以认为是一个用于计算HDR数据的插值转换函数。相关代码如下 图4.3- HDR数据还原 图4.3中trfn_apply_gain函数使用对应坐标处的HDR/SDR ratio计算出该坐标处的HDR数据之后按正常流程渲染即可。 六、总结 Android14之前各厂商HDR技术、效果各不相同因此社交平台很难适配各家的HDR图片。Ultra HDR Image的出现或许能改变这一困局统一的HDR流程和效果对于三方应用的适配提供了便利。或许不久的将来HDR图片效果就能出现在朋友圈、微博等社交平台。你别说“图像技术的未来”还真有那味了。 Ultra HDR Image整个拍摄到显示的链路很长它不是一篇文章能完整描述清楚的。本文侧重点主要在编解码模块。因为该技术较新本人拙见如有不当处还望读者朋友海涵。 参考文献 [1].https://developer.android.com/guide/topics/media/platform/hdr-image-format [2].http://aospxref.com/android-14.0.0_r2/ 往 期 推 荐 超详细Linux内核内存规整详解 Android logd日志简介及典型案例分析 OPPO在CLK大会上公布可编程内核技术引领安卓流畅体验升级 长按关注内核工匠微信 Linux内核黑科技| 技术文章| 精选教程