0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在您的应用中使用Extensions API将特效应用到照片上

谷歌开发者 来源:Android 开发者 作者:Android 开发者 2021-10-29 14:44 次阅读
Android CameraX 的设计旨在帮助您简化相机应用的开发工作。随着对 CameraX 不断的开发,相机应用的开发者们向我们展示了他们的激情和热忱,当前的 API 中已经融入了许多很棒的创意,例如值得称赞的 CameraX Extensions API。最近我们采纳了开发者社区的意见,对扩展进行了重构,如今有了新的 ExtensionsManager,您只需两行代码就可以使用这些扩展!
本文将介绍如何在您的应用中使用 Extensions API。
  • Android CameraX
    https://android-developers.googleblog.com/2019/05/whats-new-with-android-jetpack.html
  • ExtensionsManager
    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager

CameraX Extensions

Android 设备配备了强大的相机,制造商们投入了大量精力将众多前沿的功能特性或特效融入这些相机设备中。过去,这些强大的功能只能由设备的原生相机应用提供。如今,凭借 CameraX Extensions API,第三方开发者可以通过一个通用的、简单的接口来访问这些强大的相机功能。

CameraX Extensions 涵盖的内容

1.0.0 版本的 CameraX Extensions 包括一些最常见的内置相机特效:

  • BOKEH (焦外成像): 在人像模式下拍摄照片时,让前景人物更清晰。
  • HDR (高动态范围):拍照时使用不同的自动曝光 (AE) 配置,以获得最佳效果。
  • NIGHT (夜间):在低照度环境下 (通常是在夜间) 捕获最佳静态图像。
  • FACE RETOUCH (脸部照片修复):拍摄静态图像时,修饰脸部肤色、轮廓等。
  • AUTO (自动):根据周围的景色自动调整最终图像。

让我们来看几组在 Android 手机上拍摄的照片,拍照时分别启用和禁用了由 CameraX Extensions API 提供的特效。

NIGHT 模式例子

3a2a5c54-3879-11ec-82a8-dac502259ad0.png

△图 3:右侧照片启用了 NIGHT 特效。

视觉上的差异是很明显的。您可以使用 CameraX Extensions API 在您自己的应用中实现这些图像的效果。

现在让我们看看如何将 CameraX 的 API 集成到您的应用中。

Extensions API

在现有的 CameraX 应用中,首先您可以引入 camera-extensions Jetpack 库来添加 CameraX Extensions:

dependencies {    // 与 Extensions 库版本号相匹配的 CameraX 核心库    implementation 'androidx.camera1.1.0-alpha08'    implementation 'androidx.camera1.1.0-alpha08'    implementation 'androidx.camera1.1.0-alpha08'
    // CameraX Extensions 库    implementation 'androidx.camera1.0.0-alpha28'
    // 其他依赖项    implementation('androidx.concurrent1.1.0')}
接下来,通过以下步骤集成 Extensions:
  1. 获取 ExtensionsManager 实例:

    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager

  2. 检查目标设备是否支持需要用到的扩展模式;
  3. 获取一个启用扩展的 CameraSelector
  4. 使用启用扩展的 CameraSelector 调用 bindToLifecycle:

    https://developer.android.google.cn/reference/androidx/camera/lifecycle/ProcessCameraProvider#bindToLifecycle(androidx.lifecycle.LifecycleOwner,%20androidx.camera.core.CameraSelector,%20androidx.camera.core.UseCase...)

获取 ExtensionsManager 实例

第一步是用扩展库的 getInstance(Context) API 获得一个 ExtensionsManager 实例。这个 API 返回一个 ListenableFuture,我们可以在 Kotlin 挂起函数中使用 await() 来获取结果以避免阻塞主线程。(注意:在 ListenableFuture 上使用 await() 须引入 androidx.concurrent 1.1.0 依赖项。)

// 创建扩展管理器(使用 Jetpack Concurrent 库)valextensionsManager=ExtensionsManager.getInstance(context).await()

  • getInstance(Context)

    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager#getInstance(android.content.Context)

  • ExtensionsManager

    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager

通过 ExtensionsManager,您可以确定设备是否支持某一特定的扩展模式,并为其获取一个启用扩展的 CameraSelector。请注意以下几点:

  • ExtensionsManager 是一个进程范围的全局资源: 一个进程中只存在一个 ExtensionsManager 实例。

  • ExtensionsManager 始终存在:无论底层设备是否支持扩展,CameraX 都提供一个有效的 ExtensionsManager 实例。

检查扩展模式可用性

通过 ExtensionsManager,使用 isExtensionAvailable(CameraProvider, CameraSelector, int) 函数检查扩展的可用性:如果设备上存在任何经由 CameraSelector 过滤的相机支持所查询的扩展,则返回 true,否则返回 false
        // 获取相机设备来检查是否支持扩展        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
        // 检查是否支持 BOKEH        if (extensionsManager.isExtensionAvailable(                cameraProvider,                cameraSelector,                ExtensionMode.BOKEH            )) {            ...}
  • isExtensionAvailable(CameraProvider, CameraSelector, int)

    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager#isExtensionAvailable(androidx.camera.core.CameraProvider,%20androidx.camera.core.CameraSelector,%20int)

获取启用扩展的 CameraSelector

一旦您确认了设备支持该扩展模式,就可以用 getExtensionEnabledCameraSelector(CameraProvider, CameraSelector, int) 函数获取一个启用扩展的 CameraSelector。此函数返回启用扩展的 CameraSelector,其包含关于指定扩展模式的所有详细信息
val bokehCameraSelector = extensionsManager                          .getExtensionEnabledCameraSelector(cameraProvider,cameraSelector,ExtensionMode.BOKEH)

  • getExtensionEnabledCameraSelector(CameraProvider, CameraSelector, int)

    https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager#getExtensionEnabledCameraSelector(androidx.camera.core.CameraProvider,%20androidx.camera.core.CameraSelector,%20int)

使用启用扩展的 CameraSelector 调用 bindToLifecycle()

最后一步是使用 bindToLifecycle() 将您的用例与启用扩展的 CameraSelector 绑定。使用启用扩展的 CameraSelector 如同使用普通的 CameraSelector 一样,例如使用 DEFAULT_BACK_CAMERADEFAULT_FRONT_CAMERA。当使用启用扩展的 CameraSelector 绑定用例时,CameraX 会直接在相机上启用指定的扩展模式。例如,当绑定到 Preview 时,扩展效果被应用到预览中,或者应用到由所绑定的 ImageCapture 所捕获的图像上。
// 将开启了 BOKEH 的相机选择器绑定到用例上val imageCapture = ImageCapture.Builder().build()val preview = Preview.Builder().build()cameraProvider.bindToLifecycle(                lifecycleOwner,                bokehCameraSelector,                imageCapture,                preview)
  • bindToLifecycle()
    https://developer.android.google.cn/reference/androidx/camera/lifecycle/ProcessCameraProvider#bindToLifecycle(androidx.lifecycle.LifecycleOwner,%20androidx.camera.core.CameraSelector,%20androidx.camera.core.UseCase...)

  • DEFAULT_BACK_CAMERA
    https://developer.android.google.cn/reference/androidx/camera/core/CameraSelector#DEFAULT_BACK_CAMERA

  • DEFAULT_FRONT_CAMERA
    https://developer.android.google.cn/reference/androidx/camera/core/CameraSelector#DEFAULT_FRONT_CAMERA

使用 Extensions API 的样例代码

Extensions API 示例的完整代码如下:
fun onCreate() {    lifecycleScope.launch {        // 创建 cameraProvider        val cameraProvider = ProcessCameraProvider.getInstance(context).await() 
        // 创建 extensionsManager(使用 Jetpack Concurrent 库)        val extensionsManager =                 ExtensionsManager.getInstance(context).await()
        // 获取相机设备来检查是否支持扩展                val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
        // 检查是否支持 BOKEH        if (extensionsManager.isExtensionAvailable(                cameraProvider,                cameraSelector,                ExtensionMode.BOKEH            )) {            // 在启用不同扩展模式之前解除所有用例的绑定            cameraProvider.unbindAll()
//获取启用了BOKEH的相机选择器            val bokehCameraSelector = extensionsManager                    .getExtensionEnabledCameraSelector(                cameraProvider,                cameraSelector,                ExtensionMode.BOKEH            )
            // 将开启了 BOKEH 的相机选择器绑定到用例上            val imageCapture = ImageCapture.Builder().build()            val preview = Preview.Builder().build()            cameraProvider.bindToLifecycle(                lifecycleOwner,                bokehCameraSelector,                imageCapture,                preview            )        }    }}

Extensions API 对核心模块的依赖

CameraX Extensions API 是在 camera-extensions 库中实现的,并且它依赖 CameraX 核心模块 (core、camera2 和 lifecycle)。使用 CameraX Extensions 时,请务必使用与您正在使用的 CameraX 核心模块相同的发布包中的版本。例如,要使用 camera-extensions:1.0.0-alpha28,则您必须在应用的依赖列表中包含 1.0.0-alpha08 版本的 camera-lifecycle、camera-core 和 camera-camera2,因为它们是于 2021 年 8 月 18 日在同一软件包中发布的。

  • 相同的发布包
    https://developer.android.google.cn/jetpack/androidx/releases/camera

支持扩展的设备

为了能使用 CameraX Extensions API,设备制造商需要实现 CameraX Vendor Extensions 接口。您可以在 CameraX 设备页面上找到支持 CameraX Extensions API 的部分设备列表。请注意,这不是一个详尽的列表。如果您的设备被列出,但可用性检查返回了 false,您可能需要将您的设备更新到制造商的最新 ROM 版本

  • CameraX Vendor Extensions 接口
    https://source.android.com/devices/camera/camerax-vendor-extensions

  • CameraX 设备页面
    https://developer.android.google.cn/training/camerax/devices

除了支持扩展的设备列表外,从 Android 12 开始,您还可以通过检查 Android 属性ro.camerax.extensions.enabled来确定设备是否支持 CameraX Extensions。

移除旧版 Extensions API

2019 年 8 月发布的旧版 Extensions API 现已废弃。这个旧版的 Extensions API 提供了扩展器类,需要将扩展相关的配置应用到每个 PreviewImageCapture 用例上。旧版的扩展器设计可能会导致开发人员忘记要在 PreviewImageCapture 上启用扩展模式,并可能导致非预期的行为。

新的 CameraX Extensions 库在 1.0.0-alpha26 中引入。较新的 Extensions API 将扩展绑定从用例切换到目标相机,使用起来更加方便。请务必迁移以利用新的 Extensions API。

编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 应用
    +关注

    关注

    2

    文章

    436

    浏览量

    33957
  • API
    API
    +关注

    关注

    2

    文章

    1370

    浏览量

    60924
  • 代码
    +关注

    关注

    30

    文章

    4536

    浏览量

    66496

原文标题:使用 CameraX Extensions API 将特效应用到照片上

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在测试中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大会 上分享了他如何在测试中使用 ChatGPT。
    的头像 发表于 02-20 13:57 309次阅读

    何在运行时计算设计中使用的时钟频率?

    我想知道如何在运行时计算设计中使用的时钟频率(设计使用时钟组件),尤其是组件内部的时钟,例如 UART。 例如,使用 clock_getSourceRegister () 返回
    发表于 01-24 06:09

    用ADPD105应用到PPG测量,发现得到的波形失真是什么原因引起?

    用ADPD105应用到PPG测量,发现得到的波形失真。请教是什么原因引起?谢谢!
    发表于 01-08 07:07

    何在Linux中使用htop命令

    本文介绍如何在 Linux 中使用 htop 命令。
    的头像 发表于 12-04 14:45 467次阅读
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中使</b>用htop命令

    分区存储助力QLC应用到嵌入式存储设备

    分区存储助力QLC应用到嵌入式存储设备
    的头像 发表于 11-27 17:44 212次阅读
    分区存储助力QLC<b class='flag-5'>应用到</b>嵌入式存储设备

    如何将大模型应用到效能评估系统中去

    如何将大模型应用到效能评估系统中去 智慧华盛恒辉效能评估系统大数据的应用效能评估系统及其评估方法,以应用基础数据和应用运行数据为基础,从数据开放集约能力、用户认可度、平安运行能力和运维保障支持四个
    的头像 发表于 09-27 16:16 255次阅读

    如何人工智能应用到效能评估系统软件中去解决

      如何人工智能应用到效能评估系统软件中去解决   华盛恒辉效能评估系统是一种非常实用的管理工具,它可以帮助组织和企业掌握其运营状况,优化业务流程,提高效率和生产力。然而,随着人工智能的迅猛发展
    发表于 08-30 12:58

    何在Vitis HLS GUI中使用库函数?

    Vitis™ HLS 2023.1 支持新的 L1 库向导,本文将讲解如何下载 L1 库、查看所有可用功能以及如何在 Vitis HLS GUI 中使用库函数。
    的头像 发表于 08-16 10:26 548次阅读
    如<b class='flag-5'>何在</b>Vitis HLS GUI<b class='flag-5'>中使</b>用库函数?

    何在Unity中使用虚拟现实

    本指南介绍了如何使用Unity Wide和虚拟现实(VR)。 如果要将非VR应用程序移植到VR应用程序中,本指南非常有用。 该指南还展示了反射的重要性,以及如何反射应用到VR中。 大多数虚拟现实
    发表于 08-12 07:12

    何在持续集成开发流程中使用Jenkins和Docker?

    本指南介绍了如何在持续集成开发流程中使用Jenkins和Docker。 本指南的受众是嵌入式软件开发人员。在指南中,我们还讨论了测试平台的主题,强调了使用Arm Fast Model技术的虚拟硬件
    发表于 08-02 10:50

    Unity开发者Arm指南-特效图形技术介绍

    本指南介绍了几种可以在Unity程序中使用的特效技术,包括: •脏镜头效果 •雾效果 •冰墙效果 在本指南中,有图像显示了如何在示例中使特效
    发表于 08-02 06:07

    何在OpenCV中使用基于深度学习的边缘检测?

    在这篇文章中,我们将学习如何在OpenCV中使用基于深度学习的边缘检测,它比目前流行的canny边缘检测器更精确。
    的头像 发表于 05-19 09:52 1623次阅读
    如<b class='flag-5'>何在</b>OpenCV<b class='flag-5'>中使</b>用基于深度学习的边缘检测?

    语音模块可以应用到陶瓷产品中

    语音控制成为了现代科技的一大亮点。离线语音模块是语音控制的一种方式,它可以应用到各种产品中,包括陶瓷产品。
    的头像 发表于 04-27 14:54 230次阅读
    语音模块可以<b class='flag-5'>应用到</b>陶瓷产品中

    何在ESP-IDF项目中使用BSON ?

    我的基础设施可以通过 MQTT 以 BSON 格式的块接收文件进行存储。现在,我找到了可以在 Arduino Framework 中使用 BSON 库的文章。但是我无法这个库编译为 ESP-IDF
    发表于 04-14 06:59

    何在s32k mbd中使用计时器?

    我想在 s32k mbd 中使用计时器,我必须在其中计算轴原始值转换为陀螺仪角度的时间。我如何在 mbd 中使用它?
    发表于 04-10 09:39