在移动端发展的过程中,相机设备对于推动移动设备创新起到了举足轻重的作用,而相机曝光则是能够拍摄出非凡品质照片的关键要素。在本文中,我将为大家详解移动端开发者在处理相机曝光时所遇到的挑战。之后我会为大家介绍新的 CameraX 曝光补偿 (Exposure Compensation) API 如何帮助开发者应对这些挑战,使快速拍摄高品质照片变得更加简单。最后,我将为大家展示如何在您的应用中使用该 API。

背景

在摄影中,曝光是决定最终相机所呈现图像的最重要因素之一,因此大多数摄影师都极力将曝光调至最佳。自动曝光 (AE) 模式在大多数常见拍摄场景下的效果都不错,比如自动快速拍照。然而在某些特定条件下,AE 模式会为了照片的整体质量而做出一些妥协,而这些妥协有时并不是您想要的。其中一个例子就是逆光,例如,在室内朝向窗户或者其它光源的位置拍摄,或者在室外拍摄,拍摄对象的后方刚好是太阳。在这些拍摄场景中,AE 模式会因为明亮的背景 (照片中高亮的区域) 而对照片进行适当曝光,但是处于黑暗前景中的主体就会变得过于昏暗或者成为剪影效果。图 1 展示的是在相同条件 (室内逆光) 下使用不同曝光进行拍摄的三张照片。

AE 对于照片的整体质量控制得很好,但是更高的曝光确实能够捕获到 Android 公仔的更多画面细节。

传统操作中,摄影师通过调整如下三个参数来达到满意的曝光:

  • 光圈: 镜片的打开程度,它控制相机的进光量
  • 快门速度: 照片曝光的持续时间
  • ISO (国际标准化组织): 相机感光元件对捕获光线的敏感程度

每个参数对于图像都有特殊的作用: 光圈可以调整景深效果,快门速度可以虚化运动的过程或者定格运动的瞬间,而更高的 ISO 会增加图像噪点。其中用到相当精准的数学计算,但是这些参数设置的不同组合可以获得相同的整体曝光效果,以及在这个过程中获得高水准的完美曝光数值。为了辅助补偿曝光,CameraX 实现了曝光补偿 API。

实现曝光补偿 API

曝光补偿 API 根据生成的自动曝光值,通过曝光补偿指数调整曝光补偿度。曝光补偿指数可以为正值 (用于提高照片亮度) 或者负值 (降低照片亮度)。它将整体曝光范围映射到补偿指数的取值区间,并将曝光总量映射到 EV 步长。相机设备内部会根据曝光指数改变曝光,减少控制其它参数的操作并且达到同一效果。

以图 1 为例,相机的默认配置无法为我们希望对焦的主体提供足够的亮度,所以我们可以使用正值指数的曝光补偿配置来获得两倍或者四倍的曝光,从而突出主体。通过改变曝光补偿指数,相机内部会控制快门速度、光圈和 ISO 以获得合适的曝光。

要获得补偿指数,CameraX 实现了以下内容:

  1. CameraControl::setExposureCompensationIndex,用于设置新的曝光补偿指数。

  2. ExposureState 用于曝光补偿性能和当前配置,包括:

  3. 支持调整补偿

  4. 所支持的补偿范围

  5. 所支持的补偿步长

  6. 当前补偿指数值

我们来看看在 CameraX 应用中如何使用 API 来创建曝光合适的照片。

使用曝光补偿 API

要在应用中使用曝光补偿 API,您需要完成如下工作:

  • 查询曝光补偿范围
  • 设置新的曝光补偿指数
  • 当 CameraX 确认后继续后续操作

查询曝光补偿指数的范围

曝光补偿值的范围依赖 相机设备的配置和硬件级别;应用可以通过 ExposureState 接口查询所支持的取值范围。

val camera = cameraProvider.bindToLifecycle( … )
val range = camera.cameraInfo.exposureState.exposureCompensationRange

设置新的曝光补偿指数

如果照片显得较暗,在相机原本的修正曝光基础上设置一个正值的曝光补偿指数来提高亮度;同理,如果照片显得过亮,则设置一个负值。这可以通过 setExposureCompensationIndex() 来实现:

interface CameraControl {fun setExposureCompensationIndex(value: Int): ListenableFuture<Int!>
}

默认情况下,曝光补偿指数的值从 “0” 开始,新的指数值必须在相机设备所支持的范围内变化。否则 CameraX 会抛出 IllegalArgument 错误。请注意如果相机设备不支持曝光补偿调节,CameraX 所返回支持的取值范围是 [0,0]。

举个例子,下述代码中当用户点击了 UI 中的按钮会提高曝光补偿指数直到曝光指数达到所支持的最大值为止:

var exposureIndex = 0
val camera = cameraProvider.bindToLifecycle(lifecycleOwner,getCameraSelector(),preview,imageCapture,
)evButton.setOnClickListener {val range = camera.cameraInfo.exposureState.exposureCompensationRangeif (range.contains(exposureIndex + 1)) {camera.cameraControl.setExposureCompensationIndex(++exposureIndex)val ev = camera.cameraInfo.exposureState.exposureCompensationStep.toFloat() * exposureIndexLog.i("CameraXLog", "EV: $ev")}
}

setExposureCompensationIndex()async 函数,每个相机只能响应一个未处理的请求。如果应用在之前的调用未被响应之前再次调用 setExposureCompensationIndex(),新的调用请求就会替代之前的请求,而之前的请求会被取消并抛出 OperationCanceledException。通常,新的指数值会被迅速启用,输出流的曝光会随着 绑定用例 变化。如果应用需要知道特定请求的准确执行时间和结果,可以在函数返回的 ListenableFuture 之上注册监听器。

关联补偿指数和曝光值 (EV)

曝光值 (EV) 是一个用于表示曝光补偿的光照度差异的度量单位。+1 EV 表示两倍光照,+2 EV 是四倍光照,依此类推。应用可以将相同的曝光值应用到各种相机,甚至不同的设备,来获得相似的曝光,但是应用不应该针对相同的目标效果直接使用相同的指数值,因为每个指数值是相机的专属值。

补偿 API 中,曝光值是通过如下公式进行计算的:

曝光值 (EV) = exposure_compensation_index * compensation_step

上述公式中提到的 compensation_step 是曝光值可被修改的最小单位。请注意 compensation_step 也依赖相机设备。应用可以通过 ExposureState 查询相机的 compensation_step,并且可以按照下面所示计算曝光值:

val camera = cameraProvider.bindToLifecycle( … )
val exposureValue = camera.cameraInfo.exposureState.exposureCompensationStep.toFloat() * exposureIndex

例如: exposure_compensation_index 等于 6,compensation_step 等于 ⅓,那么曝光补偿计算为 +2 EV,也就是两倍的默认曝光值。

compensation_step 的 step_size 取值通常为 ⅓ 或者 ½,较少情况下,有些设备可能会支持 1 或者甚至 ¼。所能支持的最大曝光值一般是 2 EV 或者 3 EV。

CameraX 曝光补偿 API 的可用性

曝光补偿 API 是在 android.camera:camera-core:1.0.0-beta09 中首次以实验方式发布。

该 API 在版本 android.camera:camera-core:1.1.0-alpha06 中完成了实验阶段,成为正式版本 CameraX API 的一部分。

要获得最新的发布版本,请查阅 官方 CameraX 版本说明。

总结

在 GitHub 上可以找到 CameraX 曝光补偿的示例代码。结合 CameraX API 的其它部分,曝光补偿 API 可以帮助开发者实现富有创意的 Android 相机应用,并在移动应用的海洋中脱颖而出。如果您有兴趣了解更多关于 CameraX 的内容,请参阅 官方文档,如果希望能够持续获得 CameraX 的最新进展,可以加入 CameraX 讨论组。欢迎大家提出宝贵意见,可以在 CameraX 讨论组 中和我们交流,或者创建 CameraX issues 提交您遇到的问题。

相关阅读

  • setExposureCompensationIndex API
  • ExposureState API
  • CameraX 版本说明
  • Codelab: 上手使用 CameraX
  • GitHub 示例

欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

CameraX 曝光补偿 API 入门指南相关推荐

  1. android 地铁地图api,入门指南-地铁图 JS API | 高德地图API

    入门指南将带您迅速了解地铁图 JS API的基本使用,学习如何以easy模式创建地铁简易图,使您在最短时间内创建一个地铁图页面. 准备页面 在正式开始开发地图应用之前,您需要做如下几步: 申请JS A ...

  2. Web API 入门指南

    Web API是一个比较宽泛的概念.这里我们提到Web API特指ASP.NET Web API. 这篇文章中我们主要介绍Web API的主要功能以及与其他同类型框架的对比,最后通过一些相对复杂的实例 ...

  3. AngularJS快速入门指南15:API

    API即Application Programming Interface(应用程序接口). AngularJS全局API AngularJS全局API是一组全局JavaScript函数,用来进行一些 ...

  4. Flink入门——DataSet Api编程指南

    简介: Flink入门--DataSet Api编程指南 Apache Flink 是一个兼顾高吞吐.低延迟.高性能的分布式处理框架.在实时计算崛起的今天,Flink正在飞速发展.由于性能的优势和兼顾 ...

  5. JavaCV入门指南:调用opencv原生API和JavaCV是如何封装了opencv的图像处理操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  6. javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  7. Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

    入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何 ...

  8. jQuery中文入门指南,翻译加实例,jQuery的起点教程

    中文版译者:Keel 此文以实例为基础一步步说明了jQuery的工作方式.现以中文翻译(添加我的补充说明)如下.如有相关意见或建议请 EMAIL 告知.或者在 BLOG中留言. 英文原版:http:/ ...

  9. gridcontrol值为0时设置为空_XASSET 4.0入门指南

    XASSET 5.1已经发布 XASSET 5.1为Unity项目提供了可以快速投入到生产环境中使用的具有更智能和灵活的资源分包.热更新机制和稳健高效的资源加载和内存管理的资源管理方案.它不仅可以服务 ...

最新文章

  1. 指定目录的所有 *.gif 文件都重命名为 *.jpg
  2. rufus linux开机密码,使用Rufus 3.4制作Ubuntu 18.04.1 U盘启动盘的方法
  3. 你愿意隐姓埋名一辈子吗?” #百年百人系列
  4. this.get_element .style为空或不是对象
  5. 如何获取网站的ico图标呢?
  6. andrew ng 机器学习笔记_所有笔记目录 | 数据分析 | 机器学习 | 深度学习等
  7. 天线巴伦制作和原理_一种宽带集成巴伦及天线单元的制作方法
  8. Kindle Paperwhite安装PDF阅读器Koreader
  9. 【技术认证知识】网络通信基础知识(华为HCIA认证网络基础)
  10. Python之nmap-ping扫描探测主机存活
  11. 一文了解智能门锁的功能选购和安全性
  12. Jenkins 配置 Maven 环境变量
  13. android桌面 vulkan,Vulkan 设计指南
  14. vue 实现html转图片和生成二维码
  15. 作业必备:操作系统实验四【软中断通信】
  16. Largest Rectangle in a Histogram[]
  17. 关于机器学习,我总结了可能是目前最全面最无痛的入门路径和资源!
  18. 西瓜视频地址分析下载(2020-10-29)
  19. 监控摄像头RTSP低延时无插件直播解决方案
  20. 浙江理工c语言复试试题,2016年浙江理工大学信息学院C语言程序设计复试笔试最后押题五套卷...

热门文章

  1. 神州数码2855路由器ppp multilink 配置
  2. 关于模拟登陆的小结-抓包、cookie、session和token
  3. Word第1节不显示页码,从第二节开始显示页码
  4. 【simulink 直流电机转速电流双闭环系统设计】
  5. distinct用法
  6. 耐心看的人早晚会成人上人
  7. 自监督直接和具体任务的结合(Task Related Self-Supervised Learning)的探索
  8. 全球及中国信用卡市场盈利模式及创新动向分析报告2021-2027年
  9. find_if()用法
  10. 5个直播间核心方法,让你直播间不愁人气