本頁面說明如何使用 CameraX 拍攝高品質圖片。您可以使用 ImageCapture 類別及其相關聯的方法執行這項操作。
核心概念
這份文件主要討論下列概念:
- 儲存方法:您可以將圖片擷取到記憶體內緩衝區,或直接擷取到檔案。
- 執行器:
ImageCapture使用執行器處理回呼和 I/O 作業。您可以自訂這些執行器,以提升效能和控制能力。 - 拍攝模式:您可以設定拍攝模式,以最佳化延遲時間或影像品質。
儲存方法
您可以使用 ImageCapture 拍攝圖片,方法有兩種:他們各自使用 ImageCapture.takePicture() 的多載:
檔案:使用
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)將擷取的圖片直接儲存到磁碟上的檔案。- 這是最常見的拍照方式。
記憶體內:使用
takePicture(Executor, OnImageCapturedCallback)接收擷取影像的記憶體內緩衝區。- 這項功能適用於即時圖片處理或分析。
執行器
呼叫 takePicture 時,您會傳遞 Executor 和 OnImageCapturedCallback 或 OnImageSavedCallback 函式。Executor 會執行回呼,並處理任何產生的 IO。
拍照
如要拍照,請設定相機,然後呼叫 takePicture。
設定攝影機
如要設定攝影機,請建立 CameraProvider。接著,建立 ImageCapture 物件。使用 ImageCapture.Builder():
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
拍照
設定相機後,請呼叫 takePicture() 擷取圖片。
這個範例示範如何使用 takePicture() 將圖片儲存到磁碟:
fun onClick() { val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File("photo.jpg")).build() imageCapture.takePicture( outputFileOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback { override fun onError(error: ImageCaptureException) { // Insert your code here } override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { // Insert your code here } } ) }
這段程式碼的重點如下:
ImageCapture.OutputFileOptions可讓您設定儲存位置和中繼資料。- 在這裡,
OutputFileOptions.Builder()會使用File物件判斷儲存位置。
- 在這裡,
takePicture()函式會使用提供的選項和執行器,以非同步方式擷取圖片。OnImageSavedCallback會提供成功和失敗的回呼。onImageSaved()回呼會處理成功擷取的圖片,並提供儲存的圖片結果存取權。onError()回呼會處理圖片擷取錯誤。
其他選項
如需設定 ImageCapture 的其他方法,請參閱「設定最佳化、刷新和檔案格式指南」。
其他資源
如要進一步瞭解 CameraX,請參閱下列資源:
Codelab
程式碼範例