画像キャプチャ ユースケースは、高解像度かつ高画質の写真をキャプチャできるように設計されており、簡単な手動のカメラ コントロールに加え、自動ホワイト バランス、自動露出、オート フォーカス(3A)機能を備えています。以下のオプションを含め、キャプチャした画像の使用方法は、呼び出し側が決定します。
takePicture(Executor, OnImageCapturedCallback)
: このメソッドは、キャプチャした画像のメモリ内バッファを提供します。takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: このメソッドは、指定されたファイルの場所にキャプチャした画像を保存します。
ImageCapture
が実行されるカスタマイズ可能なエグゼキュータには、コールバック エグゼキュータと IO エグゼキュータの 2 種類があります。
- コールバック エグゼキュータは、
takePicture
メソッドのパラメータです。ユーザーが指定したOnImageCapturedCallback()
を実行するために使用されます。 - 呼び出し側がファイルの場所に画像を保存することを選択した場合、エグゼキュータを指定して IO を実行できます。IO エグゼキュータを設定するには、
ImageCapture.Builder.setIoExecutor(Executor)
を呼び出します。エグゼキュータが存在しない場合、CameraX はデフォルトでタスクの内部 IO エグゼキュータになります。
画像キャプチャをセットアップする
画像キャプチャは、フラッシュ、連続オートフォーカス、ゼロシャッター ラグなど、写真を撮影するための基本的なコントロールを提供します。
setCaptureMode()
ImageCapture.Builder.setCaptureMode()
を使用すると、写真撮影時のキャプチャ モードを構成できます。
CAPTURE_MODE_MINIMIZE_LATENCY
: レイテンシについて、画像キャプチャを最適化します。CAPTURE_MODE_MAXIMIZE_QUALITY
: 画質について、画像キャプチャを最適化します。
キャプチャ モードのデフォルトは 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_LAG
を ImageCapture.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
コードサンプル