画像キャプチャ

画像キャプチャ ユースケースは、高解像度かつ高画質の写真をキャプチャできるように設計されており、簡単な手動のカメラ コントロールに加え、自動ホワイト バランス、自動露出、オート フォーカス(3A)機能を備えています。以下のオプションを含め、キャプチャした画像の使用方法は、呼び出し側が決定します。

ImageCapture が実行されるカスタマイズ可能なエグゼキュータには、コールバック エグゼキュータと IO エグゼキュータの 2 種類があります。

  • コールバック エグゼキュータは、takePicture メソッドのパラメータです。ユーザーが指定した OnImageCapturedCallback() を実行するために使用されます。
  • 呼び出し側がファイルの場所に画像を保存することを選択した場合、エグゼキュータを指定して IO を実行できます。IO エグゼキュータを設定するには、ImageCapture.Builder.setIoExecutor(Executor) を呼び出します。エグゼキュータが存在しない場合、CameraX はデフォルトでタスクの内部 IO エグゼキュータになります。

画像キャプチャをセットアップする

画像キャプチャは、フラッシュ、連続オートフォーカス、ゼロシャッター ラグなど、写真を撮影するための基本的なコントロールを提供します。

setCaptureMode()

ImageCapture.Builder.setCaptureMode() を使用すると、写真撮影時のキャプチャ モードを構成できます。

キャプチャ モードのデフォルトは CAPTURE_MODE_MINIMIZE_LATENCY です。詳細については、setCaptureMode() のリファレンス ドキュメントをご覧ください。

ゼロシャッター ラグ

1.2 以降、ゼロシャッター ラグ(CAPTURE_MODE_ZERO_SHOT_LAG)をキャプチャ モードとして利用できます。ゼロシャッター ラグを有効にすると、デフォルトのキャプチャ モードである CAPTURE_MODE_MINIMIZE_LATENCY に比べてレイテンシが大幅に短縮されるため、シャッター チャンスを逃さずに済みます。

ゼロシャッター ラグは、最新の 3 つのキャプチャ フレームを保存するリングバッファを使用します。ユーザーがキャプチャ ボタンを押すと、CameraX は takePicture() を呼び出し、リングバッファはキャプチャしたフレームを、ボタン押下のタイムスタンプに最も近いタイムスタンプで取得します。次に CameraX はキャプチャ セッションを再処理して、そのフレームから画像を生成し、JPEG 形式でディスクに保存します。

前提条件

ゼロシャッター ラグを有効にする前に、isZslSupported() を使用して、デバイスが次の要件を満たしているかどうかを確認してください。

  • Android 6.0(API レベル 23)以降をターゲットとしている。
  • PRIVATE の再処理をサポートしている。

デバイスが最小要件を満たしていない場合、CameraX は CAPTURE_MODE_MINIMIZE_LATENCY にフォールバックします。

ゼロシャッター ラグは、画像キャプチャのユースケースでのみ使用できます。動画キャプチャのユースケースやカメラ拡張機能では有効にできません。最後に、フラッシュを使用するとレイテンシが増加するため、フラッシュが ON または AUTO モードの場合、ゼロシャッター ラグは機能しません。フラッシュ モードの設定について詳しくは、setFlashMode() をご覧ください。

ゼロシャッター ラグを有効にする

ゼロシャッター ラグを有効にするには、CAPTURE_MODE_ZERO_SHOT_LAGImageCapture.Builder.setCaptureMode() に渡します。失敗した場合、setCaptureMode()CAPTURE_MODE_MINIMIZE_LATENCY にフォールバックします。

setFlashMode()

デフォルトのフラッシュ モードは FLASH_MODE_OFF です。フラッシュ モードを設定するには、ImageCapture.Builder.setFlashMode() を使用します。

  • FLASH_MODE_ON: フラッシュは常に点灯します。
  • FLASH_MODE_AUTO: フラッシュは暗い場所での撮影時に自動的に点灯します。

写真撮影

次のコードサンプルは、アプリの写真撮影を構成する方法を示しています。

Kotlin

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

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

Java

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

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

bindToLifecycle()Camera オブジェクトを返します。ズームや露出など、カメラ出力の制御について詳しくは、こちらのガイドをご覧ください。

カメラを設定した後、ユーザーの操作に基づいて、次のコードによって写真が撮影されます。

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.
            }
       }
    );
}

画像キャプチャ メソッドは、JPEG 形式を完全にサポートしています。Media.Image オブジェクトを YUV_420_888 形式から RGB Bitmap オブジェクトに変換する方法を示すサンプルコードについては、YuvToRgbConverter.kt をご覧ください。

参考情報

CameraX について詳しくは、以下の参考情報をご確認ください。

Codelab

  • CameraX のスタートガイド
  • コードサンプル

  • CameraX のサンプルアプリ