擷取圖片

本頁面說明如何使用 CameraX 拍攝高品質圖片。您可以使用 ImageCapture 類別及其相關聯的方法來執行這項操作。

核心概念

以下是本文討論的主要概念:

  • 儲存方法您可以將圖片擷取到記憶體緩衝區,或直接擷取到檔案。
  • 執行器 ImageCapture 會使用執行器處理回呼和 I/O 作業。您可以自訂這些執行緒,以提升效能和控制能力。
  • 拍攝模式您可以設定拍攝模式,以便針對延遲時間或影像品質進行最佳化。

儲存方式

您可以透過兩種方式使用 ImageCapture 擷取圖片。每個方法都使用 ImageCapture.takePicture() 的超載:

執行器

呼叫 takePicture 時,您會傳遞 ExecutorOnImageCapturedCallbackOnImageSavedCallback 函式。Executor 會執行回呼,並處理任何產生的 I/O。

拍攝相片

如要拍照,您必須設定相機,然後呼叫 takePicture

設定攝影機

如要設定攝影機,請建立 CameraProvider。接著,建立 ImageCapture 物件。使用 ImageCapture.Builder()

Kotlin

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview);

拍照

設定相機後,請呼叫 takePicture() 擷取圖片。以下範例說明如何使用 takePicture() 將圖片儲存到磁碟:

Kotlin

fun onClick() {
    val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)).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.
            }
        })
}

Java

public void onClick() {
    ImageCapture.OutputFileOptions outputFileOptions =
            new ImageCapture.OutputFileOptions.Builder(new File(...)).build();
    imageCapture.takePicture(outputFileOptions, cameraExecutor,
        new ImageCapture.OnImageSavedCallback() {
            @Override
            public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
                // insert your code here.
            }
            @Override
            public void onError(ImageCaptureException error) {
                // insert your code here.
            }
       }
    );
}

以下是這個程式碼片段的重點:

  • ImageCapture.OutputFileOptions 可讓您設定儲存位置和中繼資料。
    • 在這裡,OutputFileOptions.Builder() 會使用 File 物件來判斷儲存位置。
  • takePicture() 函式會使用提供的選項和執行緒,以非同步方式擷取圖片。
  • OnImageSavedCallback 會提供成功和失敗的回呼。
    • onImageSaved() 回呼會處理成功的圖片擷取作業,並提供對已儲存圖片結果的存取權。
    • onError() 回呼會處理圖片擷取錯誤。

其他選項

如要瞭解其他設定 ImageCapture 的方式,請參閱設定最佳化、閃光和檔案格式指南

其他資源

如要進一步瞭解 CameraX,請參閱下列資源:

程式碼研究室

  • 開始使用 CameraX
  • 程式碼範例

  • CameraX 範例應用程式