-
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è)備配備了強(qiáng)大的相機(jī),制造商們投入了大量精力將眾多前沿的功能特性或特效融入這些相機(jī)設(shè)備中。過去,這些強(qiáng)大的功能只能由設(shè)備的原生相機(jī)應(yīng)用提供。如今,憑借 CameraX Extensions API,第三方開發(fā)者可以通過一個(gè)通用的、簡(jiǎn)單的接口來訪問這些強(qiáng)大的相機(jī)功能。CameraX Extensions 涵蓋的內(nèi)容
1.0.0 版本的 CameraX Extensions 包括一些最常見的內(nèi)置相機(jī)特效:
- BOKEH (焦外成像): 在人像模式下拍攝照片時(shí),讓前景人物更清晰。
- HDR (高動(dòng)態(tài)范圍):拍照時(shí)使用不同的自動(dòng)曝光 (AE) 配置,以獲得最佳效果。
- NIGHT (夜間):在低照度環(huán)境下 (通常是在夜間) 捕獲最佳靜態(tài)圖像。
- FACE RETOUCH (臉部照片修復(fù)):拍攝靜態(tài)圖像時(shí),修飾臉部膚色、輪廓等。
- AUTO (自動(dòng)):根據(jù)周圍的景色自動(dòng)調(diào)整最終圖像。
讓我們來看幾組在 Android 手機(jī)上拍攝的照片,拍照時(shí)分別啟用和禁用了由 CameraX Extensions API 提供的特效。
NIGHT 模式例子

△圖 3:右側(cè)照片啟用了 NIGHT 特效。
視覺上的差異是很明顯的。您可以使用 CameraX Extensions API 在您自己的應(yīng)用中實(shí)現(xiàn)這些圖像的效果。
現(xiàn)在讓我們看看如何將 CameraX 的 API 集成到您的應(yīng)用中。
Extensions API
在現(xiàn)有的 CameraX 應(yīng)用中,首先您可以引入 camera-extensions Jetpack 庫來添加 CameraX Extensions:
接下來,通過以下步驟集成 Extensions:dependencies {// 與 Extensions 庫版本號(hào)相匹配的 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'// 其他依賴項(xiàng)implementation('androidx.concurrent1.1.0')…}
-
獲取 ExtensionsManager 實(shí)例:
https://developer.android.google.cn/reference/androidx/camera/extensions/ExtensionsManager
- 檢查目標(biāo)設(shè)備是否支持需要用到的擴(kuò)展模式;
- 獲取一個(gè)啟用擴(kuò)展的 CameraSelector;
-
使用啟用擴(kuò)展的 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 實(shí)例
第一步是用擴(kuò)展庫的 getInstance(Context) API 獲得一個(gè) ExtensionsManager 實(shí)例。這個(gè) API 返回一個(gè) ListenableFuture,我們可以在 Kotlin 掛起函數(shù)中使用 await() 來獲取結(jié)果以避免阻塞主線程。(注意:在 ListenableFuture 上使用 await() 須引入 androidx.concurrent 1.1.0 依賴項(xiàng)。)
// 創(chuàng)建擴(kuò)展管理器(使用 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è)備是否支持某一特定的擴(kuò)展模式,并為其獲取一個(gè)啟用擴(kuò)展的 CameraSelector。請(qǐng)注意以下幾點(diǎn):
-
ExtensionsManager 是一個(gè)進(jìn)程范圍的全局資源: 一個(gè)進(jìn)程中只存在一個(gè) ExtensionsManager 實(shí)例。
-
ExtensionsManager 始終存在:無論底層設(shè)備是否支持?jǐn)U展,CameraX 都提供一個(gè)有效的 ExtensionsManager 實(shí)例。
檢查擴(kuò)展模式可用性
通過 ExtensionsManager,使用 isExtensionAvailable(CameraProvider, CameraSelector, int) 函數(shù)檢查擴(kuò)展的可用性:如果設(shè)備上存在任何經(jīng)由 CameraSelector 過濾的相機(jī)支持所查詢的擴(kuò)展,則返回 true,否則返回 false。// 獲取相機(jī)設(shè)備來檢查是否支持?jǐn)U展val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA// 檢查是否支持 BOKEHif (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)
獲取啟用擴(kuò)展的 CameraSelector
一旦您確認(rèn)了設(shè)備支持該擴(kuò)展模式,就可以用 getExtensionEnabledCameraSelector(CameraProvider, CameraSelector, int) 函數(shù)獲取一個(gè)啟用擴(kuò)展的 CameraSelector。此函數(shù)返回啟用擴(kuò)展的 CameraSelector,其包含關(guān)于指定擴(kuò)展模式的所有詳細(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)
使用啟用擴(kuò)展的 CameraSelector 調(diào)用 bindToLifecycle()
最后一步是使用 bindToLifecycle() 將您的用例與啟用擴(kuò)展的 CameraSelector 綁定。使用啟用擴(kuò)展的 CameraSelector 如同使用普通的 CameraSelector 一樣,例如使用 DEFAULT_BACK_CAMERA 或 DEFAULT_FRONT_CAMERA。當(dāng)使用啟用擴(kuò)展的 CameraSelector 綁定用例時(shí),CameraX 會(huì)直接在相機(jī)上啟用指定的擴(kuò)展模式。例如,當(dāng)綁定到 Preview 時(shí),擴(kuò)展效果被應(yīng)用到預(yù)覽中,或者應(yīng)用到由所綁定的 ImageCapture 所捕獲的圖像上。// 將開啟了 BOKEH 的相機(jī)選擇器綁定到用例上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)建 cameraProviderval cameraProvider = ProcessCameraProvider.getInstance(context).await()// 創(chuàng)建 extensionsManager(使用 Jetpack Concurrent 庫)val extensionsManager =ExtensionsManager.getInstance(context).await()// 獲取相機(jī)設(shè)備來檢查是否支持?jǐn)U展val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA// 檢查是否支持 BOKEHif (extensionsManager.isExtensionAvailable(cameraProvider,cameraSelector,ExtensionMode.BOKEH)) {// 在啟用不同擴(kuò)展模式之前解除所有用例的綁定cameraProvider.unbindAll()//獲取啟用了BOKEH的相機(jī)選擇器val bokehCameraSelector = extensionsManager.getExtensionEnabledCameraSelector(cameraProvider,cameraSelector,ExtensionMode.BOKEH)// 將開啟了 BOKEH 的相機(jī)選擇器綁定到用例上val imageCapture = ImageCapture.Builder().build()val preview = Preview.Builder().build()cameraProvider.bindToLifecycle(lifecycleOwner,bokehCameraSelector,imageCapture,preview)}}}
Extensions API 對(duì)核心模塊的依賴
CameraX Extensions API 是在 camera-extensions 庫中實(shí)現(xiàn)的,并且它依賴 CameraX 核心模塊 (core、camera2 和 lifecycle)。使用 CameraX Extensions 時(shí),請(qǐng)務(wù)必使用與您正在使用的 CameraX 核心模塊相同的發(fā)布包中的版本。例如,要使用 camera-extensions:1.0.0-alpha28,則您必須在應(yīng)用的依賴列表中包含 1.0.0-alpha08 版本的 camera-lifecycle、camera-core 和 camera-camera2,因?yàn)樗鼈兪怯?2021 年 8 月 18 日在同一軟件包中發(fā)布的。
-
相同的發(fā)布包
https://developer.android.google.cn/jetpack/androidx/releases/camera
支持?jǐn)U展的設(shè)備
為了能使用 CameraX Extensions API,設(shè)備制造商需要實(shí)現(xiàn) CameraX Vendor Extensions 接口。您可以在 CameraX 設(shè)備頁面上找到支持 CameraX Extensions API 的部分設(shè)備列表。請(qǐng)注意,這不是一個(gè)詳盡的列表。如果您的設(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)已廢棄。這個(gè)舊版的 Extensions API 提供了擴(kuò)展器類,需要將擴(kuò)展相關(guān)的配置應(yīng)用到每個(gè) Preview 和 ImageCapture 用例上。舊版的擴(kuò)展器設(shè)計(jì)可能會(huì)導(dǎo)致開發(fā)人員忘記要在 Preview 或 ImageCapture 上啟用擴(kuò)展模式,并可能導(dǎo)致非預(yù)期的行為。
新的 CameraX Extensions 庫在 1.0.0-alpha26 中引入。較新的 Extensions API 將擴(kuò)展綁定從用例切換到目標(biāo)相機(jī),使用起來更加方便。請(qǐng)務(wù)必遷移以利用新的 Extensions API。
-
應(yīng)用
+關(guān)注
關(guān)注
2文章
455瀏覽量
34852 -
API
+關(guān)注
關(guān)注
2文章
2373瀏覽量
66791 -
代碼
+關(guān)注
關(guān)注
30文章
4968瀏覽量
73990
原文標(biāo)題:使用 CameraX Extensions API 將特效應(yīng)用到照片上
文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
1688品類API:熱門行業(yè)榜單,選品指南!
如何在DGX Spark上運(yùn)行NVIDIA Omniverse
如何在AMD Vitis Unified IDE中使用系統(tǒng)設(shè)備樹
淘寶平臺(tái)獲取商品視頻 API 接口技術(shù)指南
如何在vivadoHLS中使用.TLite模型
API接口使用全指南:從基礎(chǔ)調(diào)用到實(shí)戰(zhàn)技巧
產(chǎn)品添加與上架API接口設(shè)計(jì)指南
針對(duì)“您的應(yīng)用使用了HarmonyOS beta版本的API”的解決方法##HarmonyOS應(yīng)用上架##
如何將一個(gè)FA模型開發(fā)的聲明式范式應(yīng)用切換到Stage模型
如何在 Raspberry Pi AI Camera 上構(gòu)建為開發(fā)人員提供實(shí)時(shí)的智能應(yīng)用程序!
解鎖垂直美學(xué)!如何在你的Raspberry Pi相框中僅顯示豎版照片!
如何在 樹莓派 上編寫和運(yùn)行 C 語言程序?
如何在您的應(yīng)用中使用Extensions API將特效應(yīng)用到照片上
評(píng)論