图像捕捉用例旨在捕捉高分辨率、高质量的照片,并提供自动白平衡、自动曝光和自动对焦 (3A) 功能,以及简单的手动相机控件。调用方负责决定如何使用捕获的图片,包括以下选项
takePicture(Executor, OnImageCapturedCallback)
:此方法提供捕获图像的内存缓冲区。takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
:此方法将捕获的图像保存到提供的文件位置。
ImageCapture
运行时,有两种可自定义的执行器,回调执行器和IO执行器。
- 回调执行器是
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
相比,延迟显著降低,因此您永远不会错过拍摄时机。
零快门延迟使用环形缓冲区存储最近的三个捕获帧。当用户按下捕获按钮时,CameraX会调用takePicture()
,并且环形缓冲区会检索捕获帧,该帧的时间戳最接近按钮按下时间戳。然后,CameraX会重新处理捕获会话以从该帧生成图像,该图像以JPEG格式保存到磁盘。
先决条件
在启用零快门延迟之前,请使用isZslSupported()
确定您的设备是否满足以下要求。
- 目标 Android 6.0+(API 级别 23 及更高版本)。
- 支持
PRIVATE
重新处理。
对于不满足最低要求的设备,CameraX将回退到CAPTURE_MODE_MINIMIZE_LATENCY
。
零快门延迟仅适用于图像捕获用例。您无法在视频捕获用例或使用相机扩展时启用它。最后,由于使用闪光灯会导致更大的延迟,因此在闪光灯打开或自动模式下,零快门延迟不起作用。有关设置闪光灯模式的更多信息,请参阅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
格式转换为RGBBitmap
对象的示例代码,请参阅YuvToRgbConverter.kt
。
其他资源
要了解有关 CameraX 的更多信息,请查阅以下其他资源。
Codelab
代码示例