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

    文章

    441

    浏览量

    34775
  • API
    API
    +关注

    关注

    2

    文章

    2152

    浏览量

    66241
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    何在AMD Vitis Unified IDE中使用系统设备树

    您将在这篇博客中了解系统设备树 (SDT) 以及如何在 AMD Vitis Unified IDE 中使用 SDT 维护来自 XSA 的硬件元数据。本文还讲述了如何对 SDT 进行操作,以便在 Vitis Unified IDE 中实现更灵活的使用场景。
    的头像 发表于 11-18 11:13 2814次阅读
    如<b class='flag-5'>何在</b>AMD Vitis Unified IDE<b class='flag-5'>中使</b>用系统设备树

    淘宝平台获取商品视频 API 接口技术指南

    于数据分析、第三方应用集成等场景。以下内容基于淘宝开放平台的官方文档和常见开发实践,确保真实可靠。我逐步引导完成整个过程,包括注册、认证、调用 API 和代码示例。 1. 准备工作:注册淘宝开发者账号 在调用
    的头像 发表于 11-07 14:01 264次阅读
    淘宝平台获取商品视频 <b class='flag-5'>API</b> 接口技术指南

    何在vivadoHLS中使用.TLite模型

    本帖欲分享如何在vivadoHLS中使用.TLite模型。在Vivado HLS中导入模型后,需要设置其输入和输出接口以与的设计进行适配。 1. 在Vivado HLS项目中导入模型文件 可以
    发表于 10-22 06:29

    API接口使用全指南:从基础调用到实战技巧

    一、API接口的基本认知 API接口本质是一组预先定义的规则,规定了不同系统之间如何传递数据。常见的API类型包括: RESTful API
    的头像 发表于 10-08 09:25 394次阅读

    产品添加与API接口设计指南

    ​ 在现代电商或库存管理系统中,产品添加与架是关键流程。通过API接口实现自动化操作,能显著提升效率。本文分步解析如何设计和使用“产品添加”与“产品架”
    的头像 发表于 07-24 14:45 439次阅读
    产品添加与<b class='flag-5'>上</b>架<b class='flag-5'>API</b>接口设计指南

    针对“的应用使用了HarmonyOS beta版本的API”的解决方法##HarmonyOS应用上架##

    API指的是API18,而且我这次的更新也只是修改了UI而已,不可能涉及beta版本的API,并且其中我使用到的textinput的type、bindsheet等,我都是检查过,
    发表于 06-30 17:30

    请问如何在C++中使用NPU的模型缓存?

    无法确定如何在 C++ 中的 NPU 使用模型缓存
    发表于 06-24 07:25

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

    行业芯事行业资讯
    北京华盛恒辉科技
    发布于 :2025年06月17日 10:14:07

    如何人工智能应用到效能评估

    行业芯事行业资讯
    北京华盛恒辉科技
    发布于 :2025年06月17日 10:13:04

    如何一个FA模型开发的声明式范式应用切换到Stage模型

    Widget在FA中为FormAbility,在Stage中为FormExtensionAbility)。 API切换:FA模型应用中使用到的FAModelOnly接口切换为St
    发表于 06-04 06:22

    解锁垂直美学!如何在你的Raspberry Pi相框中仅显示竖版照片

    何在你的RaspberryPi相框中仅显示竖幅照片这篇文章可能只针对一小部分读者,但这就是像这样的博客的乐趣所在:你可以深入探索各种极客话题。已在搭载BookwormWayland
    的头像 发表于 03-25 09:33 661次阅读
    解锁垂直美学!如<b class='flag-5'>何在</b>你的Raspberry Pi相框中仅显示竖版<b class='flag-5'>照片</b>!

    何在 树莓派 编写和运行 C 语言程序?

    在本教程中,我讨论C编程语言是什么,C编程的用途,以及如何在RaspberryPi编写和运行C程序。本文的目的是为介绍在RaspberryPi上进行C编程的基础知识。如果您想深入
    的头像 发表于 03-25 09:28 940次阅读
    如<b class='flag-5'>何在</b> 树莓派 <b class='flag-5'>上</b>编写和运行 C 语言程序?

    何在MATLAB中使用DeepSeek模型

    在 DeepSeek-R1(https://github.com/deepseek-ai/DeepSeek-R1) AI 模型横空出世后,人们几乎就立马开始询问如何在 MATLAB 中使用这些模型
    的头像 发表于 02-13 09:20 4063次阅读
    如<b class='flag-5'>何在</b>MATLAB<b class='flag-5'>中使</b>用DeepSeek模型

    何在Windows中使用MTP协议

    、图片等)的通信协议,它被广泛用于Android设备。以下是如何在Windows中使用MTP协议的详细步骤: 1. 确保设备支持MTP 首先,你需要确认你的设备支持MTP协议。大多数现代Android
    的头像 发表于 01-03 10:26 4415次阅读

    何在Linux系统设置站群服务器IP地址

    在Linux系统设置站群服务器的IP地址,可以通过以下步骤进行,主机推荐小编为整理发布如何在Linux系统设置站群服务器IP地址。
    的头像 发表于 12-11 10:05 863次阅读