0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在您的應(yīng)用中使用Extensions API將特效應(yīng)用到照片上

谷歌開發(fā)者 ? 來源:Android 開發(fā)者 ? 作者:Android 開發(fā)者 ? 2021-10-29 14:44 ? 次閱讀
Android CameraX 的設(shè)計旨在幫助您簡化相機應(yīng)用的開發(fā)工作。隨著對 CameraX 不斷的開發(fā),相機應(yīng)用的開發(fā)者們向我們展示了他們的激情和熱忱,當(dāng)前的 API 中已經(jīng)融入了許多很棒的創(chuàng)意,例如值得稱贊的 CameraX Extensions API。最近我們采納了開發(fā)者社區(qū)的意見,對擴展進(jìn)行了重構(gòu),如今有了新的 ExtensionsManager,您只需兩行代碼就可以使用這些擴展!
本文將介紹如何在您的應(yīng)用中使用 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 設(shè)備配備了強大的相機,制造商們投入了大量精力將眾多前沿的功能特性或特效融入這些相機設(shè)備中。過去,這些強大的功能只能由設(shè)備的原生相機應(yīng)用提供。如今,憑借 CameraX Extensions API,第三方開發(fā)者可以通過一個通用的、簡單的接口來訪問這些強大的相機功能。

CameraX Extensions 涵蓋的內(nèi)容

1.0.0 版本的 CameraX Extensions 包括一些最常見的內(nèi)置相機特效:

  • BOKEH (焦外成像): 在人像模式下拍攝照片時,讓前景人物更清晰。
  • HDR (高動態(tài)范圍):拍照時使用不同的自動曝光 (AE) 配置,以獲得最佳效果。
  • NIGHT (夜間):在低照度環(huán)境下 (通常是在夜間) 捕獲最佳靜態(tài)圖像。
  • FACE RETOUCH (臉部照片修復(fù)):拍攝靜態(tài)圖像時,修飾臉部膚色、輪廓等。
  • AUTO (自動):根據(jù)周圍的景色自動調(diào)整最終圖像。

讓我們來看幾組在 Android 手機上拍攝的照片,拍照時分別啟用和禁用了由 CameraX Extensions API 提供的特效。

NIGHT 模式例子

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

△圖 3:右側(cè)照片啟用了 NIGHT 特效。

視覺上的差異是很明顯的。您可以使用 CameraX Extensions API 在您自己的應(yīng)用中實現(xiàn)這些圖像的效果。

現(xiàn)在讓我們看看如何將 CameraX 的 API 集成到您的應(yīng)用中。

Extensions API

在現(xiàn)有的 CameraX 應(yīng)用中,首先您可以引入 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. 檢查目標(biāo)設(shè)備是否支持需要用到的擴展模式;
  3. 獲取一個啟用擴展的 CameraSelector
  4. 使用啟用擴展的 CameraSelector 調(diào)用 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 掛起函數(shù)中使用 await() 來獲取結(jié)果以避免阻塞主線程。(注意:在 ListenableFuture 上使用 await() 須引入 androidx.concurrent 1.1.0 依賴項。)

// 創(chuàng)建擴展管理器(使用 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,您可以確定設(shè)備是否支持某一特定的擴展模式,并為其獲取一個啟用擴展的 CameraSelector。請注意以下幾點:

  • ExtensionsManager 是一個進(jìn)程范圍的全局資源: 一個進(jìn)程中只存在一個 ExtensionsManager 實例。

  • ExtensionsManager 始終存在:無論底層設(shè)備是否支持?jǐn)U展,CameraX 都提供一個有效的 ExtensionsManager 實例。

檢查擴展模式可用性

通過 ExtensionsManager,使用 isExtensionAvailable(CameraProvider, CameraSelector, int) 函數(shù)檢查擴展的可用性:如果設(shè)備上存在任何經(jīng)由 CameraSelector 過濾的相機支持所查詢的擴展,則返回 true,否則返回 false。
        // 獲取相機設(shè)備來檢查是否支持?jǐn)U展        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

一旦您確認(rèn)了設(shè)備支持該擴展模式,就可以用 getExtensionEnabledCameraSelector(CameraProvider, CameraSelector, int) 函數(shù)獲取一個啟用擴展的 CameraSelector。此函數(shù)返回啟用擴展的 CameraSelector,其包含關(guān)于指定擴展模式的所有詳細(xì)信息。
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 調(diào)用 bindToLifecycle()

最后一步是使用 bindToLifecycle() 將您的用例與啟用擴展的 CameraSelector 綁定。使用啟用擴展的 CameraSelector 如同使用普通的 CameraSelector 一樣,例如使用 DEFAULT_BACK_CAMERADEFAULT_FRONT_CAMERA。當(dāng)使用啟用擴展的 CameraSelector 綁定用例時,CameraX 會直接在相機上啟用指定的擴展模式。例如,當(dāng)綁定到 Preview 時,擴展效果被應(yīng)用到預(yù)覽中,或者應(yīng)用到由所綁定的 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 {        // 創(chuàng)建 cameraProvider        val cameraProvider = ProcessCameraProvider.getInstance(context).await() 
        // 創(chuàng)建 extensionsManager(使用 Jetpack Concurrent 庫)        val extensionsManager =                 ExtensionsManager.getInstance(context).await()
        // 獲取相機設(shè)備來檢查是否支持?jǐn)U展                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 庫中實現(xiàn)的,并且它依賴 CameraX 核心模塊 (core、camera2 和 lifecycle)。使用 CameraX Extensions 時,請務(wù)必使用與您正在使用的 CameraX 核心模塊相同的發(fā)布包中的版本。例如,要使用 camera-extensions:1.0.0-alpha28,則您必須在應(yīng)用的依賴列表中包含 1.0.0-alpha08 版本的 camera-lifecycle、camera-core 和 camera-camera2,因為它們是于 2021 年 8 月 18 日在同一軟件包中發(fā)布的。

  • 相同的發(fā)布包
    https://developer.android.google.cn/jetpack/androidx/releases/camera

支持?jǐn)U展的設(shè)備

為了能使用 CameraX Extensions API,設(shè)備制造商需要實現(xiàn) CameraX Vendor Extensions 接口。您可以在 CameraX 設(shè)備頁面上找到支持 CameraX Extensions API 的部分設(shè)備列表。請注意,這不是一個詳盡的列表。如果您的設(shè)備被列出,但可用性檢查返回了 false,您可能需要將您的設(shè)備更新到制造商的最新 ROM 版本。

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

  • CameraX 設(shè)備頁面
    https://developer.android.google.cn/training/camerax/devices

除了支持?jǐn)U展的設(shè)備列表外,從 Android 12 開始,您還可以通過檢查 Android 屬性ro.camerax.extensions.enabled來確定設(shè)備是否支持 CameraX Extensions。

移除舊版 Extensions API

2019 年 8 月發(fā)布的舊版 Extensions API 現(xiàn)已廢棄。這個舊版的 Extensions API 提供了擴展器類,需要將擴展相關(guān)的配置應(yīng)用到每個 PreviewImageCapture 用例上。舊版的擴展器設(shè)計可能會導(dǎo)致開發(fā)人員忘記要在 PreviewImageCapture 上啟用擴展模式,并可能導(dǎo)致非預(yù)期的行為。

新的 CameraX Extensions 庫在 1.0.0-alpha26 中引入。較新的 Extensions API 將擴展綁定從用例切換到目標(biāo)相機,使用起來更加方便。請務(wù)必遷移以利用新的 Extensions API。

編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 應(yīng)用
    +關(guān)注

    關(guān)注

    2

    文章

    439

    瀏覽量

    34183
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1507

    瀏覽量

    62209
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4807

    瀏覽量

    68806

原文標(biāo)題:使用 CameraX Extensions API 將特效應(yīng)用到照片上

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    何在Windows中使用MTP協(xié)議

    、圖片等)的通信協(xié)議,它被廣泛用于Android設(shè)備。以下是如何在Windows中使用MTP協(xié)議的詳細(xì)步驟: 1. 確保設(shè)備支持MTP 首先,你需要確認(rèn)你的設(shè)備支持MTP協(xié)議。大多數(shù)現(xiàn)代Android
    的頭像 發(fā)表于 01-03 10:26 ?177次閱讀

    光電效應(yīng)與電子伏特效應(yīng)的區(qū)別

    在物理學(xué)中,光電效應(yīng)和電子伏特效應(yīng)是兩個重要的概念,它們都涉及到光與物質(zhì)的相互作用。光電效應(yīng)描述的是光照射到金屬表面時,金屬會釋放出電子的現(xiàn)象;而電子伏特效應(yīng)則是指電子在電場中獲得能量
    的頭像 發(fā)表于 11-25 13:38 ?317次閱讀

    何在智能手機系統(tǒng)中使用bq27505

    電子發(fā)燒友網(wǎng)站提供《如何在智能手機系統(tǒng)中使用bq27505.pdf》資料免費下載
    發(fā)表于 10-17 10:21 ?0次下載
    如<b class='flag-5'>何在</b>智能手機系統(tǒng)<b class='flag-5'>中使</b>用bq27505

    何在MSP430?MCU中使用智能模擬組合

    電子發(fā)燒友網(wǎng)站提供《如何在MSP430?MCU中使用智能模擬組合.pdf》資料免費下載
    發(fā)表于 09-14 10:19 ?0次下載
    如<b class='flag-5'>何在</b>MSP430?MCU<b class='flag-5'>中使</b>用智能模擬組合

    何在反向降壓-升壓拓?fù)?b class='flag-5'>中使用TPS6290x

    電子發(fā)燒友網(wǎng)站提供《如何在反向降壓-升壓拓?fù)?b class='flag-5'>中使用TPS6290x.pdf》資料免費下載
    發(fā)表于 09-13 10:07 ?0次下載
    如<b class='flag-5'>何在</b>反向降壓-升壓拓?fù)?b class='flag-5'>中使</b>用TPS6290x

    鎖相放大器如何應(yīng)用到電腦

    鎖相放大器(也稱為相位檢測器)的應(yīng)用可以通過連接到電腦來增強其功能性和數(shù)據(jù)處理的便捷性。以下是鎖相放大器如何應(yīng)用到電腦步驟和注意事項: 一、硬件連接 選擇合適的接口 : 鎖相放大器通常具有多種接口
    的頭像 發(fā)表于 09-05 10:28 ?517次閱讀

    產(chǎn)品應(yīng)用到TLC271 ID,有沒有替代料可以推薦?

    TLC070,項目應(yīng)用到TLC271ID 這個物料,需要用到其管腳offset N1和offset N1管腳做調(diào)零功能,同時希望芯片的溫漂和噪聲能盡可能低一些,有沒有合適的運放可以推薦的
    發(fā)表于 08-01 07:48

    如何人工智能應(yīng)用到效能評估工具中去解決

    智慧華盛恒輝人工智能應(yīng)用到效能評估工具中,可以通過以下幾個步驟來實現(xiàn),以提升評估的準(zhǔn)確性、效率和實用性: 智慧華盛恒輝一、明確評估目標(biāo)與指標(biāo) 確定效能評估的目標(biāo):首先,需要明確效能評估的具體目標(biāo)
    的頭像 發(fā)表于 07-24 10:34 ?346次閱讀

    何在RTOS中使用spi_interface.c?

    何在 RTOS 中使用 spi_interface.c?
    發(fā)表于 07-10 06:29

    請問cmakelists中的變量如何在程序中使用?

    大家好, 我有個問題請教,cmakelists.txt中的變量如何在程序中使用?比如以下cmakelists.txt文件中的PROJECT_VER變量,我如何在c程序中使用?試了很多辦
    發(fā)表于 06-11 07:34

    EPSON晶振應(yīng)用到汽車電子產(chǎn)品的型號有哪些

    .愛普生品牌晶振型號就有幾百種,很容易混淆,要想記住汽車?yán)锼?b class='flag-5'>應(yīng)用到的不是件易事.那么EPSON晶振應(yīng)用到汽車電子的型號有哪些呢?1、Car Navigation(
    發(fā)表于 04-18 09:46 ?0次下載

    工業(yè)計算機是什么?如何在不同行業(yè)中使用?

    工業(yè)電腦是專為在工業(yè)環(huán)境中使用而設(shè)計的計算機。它們可用于各個行業(yè),包括制造、運 輸和能源。它們通常比普通計算機更強大,并且能夠在大多數(shù)計算機無法運行的環(huán)境中運行。在本文中,我們更深入地了解什么是工業(yè)計算機以及它們?nèi)?b class='flag-5'>何在不同行業(yè)
    的頭像 發(fā)表于 04-01 15:45 ?843次閱讀
    工業(yè)計算機是什么?如<b class='flag-5'>何在</b>不同行業(yè)<b class='flag-5'>中使</b>用?

    【從0開始創(chuàng)建AWTK應(yīng)用程序】編譯應(yīng)用到RTOS平臺

    AWStudio編寫好AWTK應(yīng)用程序后,部署到RTOS平臺(如STM32)是很方便的,下面就以STM32F429型號為例子來介紹如何編譯AWTK應(yīng)用到RTOS
    的頭像 發(fā)表于 03-21 08:23 ?644次閱讀
    【從0開始創(chuàng)建AWTK應(yīng)用程序】編譯<b class='flag-5'>應(yīng)用到</b>RTOS平臺

    何在測試中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大會 分享了他如何在測試中使用 ChatGPT。
    的頭像 發(fā)表于 02-20 13:57 ?780次閱讀

    何在運行時計算設(shè)計中使用的時鐘頻率?

    我想知道如何在運行時計算設(shè)計中使用的時鐘頻率(設(shè)計使用時鐘組件),尤其是組件內(nèi)部的時鐘,例如 UART。 例如,使用 clock_getSourceRegister () 返回
    發(fā)表于 01-24 06:09