El caso de uso de captura de imágenes está diseñado para capturar fotos de alta calidad y resolución, y proporciona balance de blancos automático, exposición automática y enfoque automático (3A), además de los controles de cámaras simples y manuales. El emisor tiene la responsabilidad de decidir cómo usar la imagen capturada. Estas son algunas de las opciones:
takePicture(Executor, OnImageCapturedCallback)
: Este método proporciona un búfer en la memoria de la imagen capturada.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Este método guarda la imagen capturada en la ubicación de archivos proporcionada.
Hay dos tipos de ejecutores personalizables en los que se ejecuta ImageCapture
: el ejecutor de devolución de llamada y el ejecutor de IO.
- El ejecutor de devolución de llamada es el parámetro de los métodos
takePicture
. Se usa para ejecutar el elementoOnImageCapturedCallback()
proporcionado por el usuario. - Si el emisor decide guardar la imagen en una ubicación de archivo, puedes especificar un ejecutor para que realice el proceso de IO. Para configurar el ejecutor de IO, llama a
ImageCapture.Builder.setIoExecutor(Executor)
. Si el ejecutor está ausente, de forma predeterminada, CameraX usará un ejecutor de IO interno para la tarea.
Cómo configurar la captura de imágenes
La captura de imágenes proporciona controles básicos para tomar fotos, como flash, enfoque automático continuo, retraso sin obturador y mucho más.
setCaptureMode()
Usa ImageCapture.Builder.setCaptureMode()
para configurar el modo de captura cuando tomes una foto:
CAPTURE_MODE_MINIMIZE_LATENCY
: Optimiza la captura de imágenes para la latencia.CAPTURE_MODE_MAXIMIZE_QUALITY
: Optimiza la captura de imágenes para mejorar su calidad.
El modo de captura predeterminado es CAPTURE_MODE_MINIMIZE_LATENCY
.
Para obtener más información, consulta la documentación de referencia de setCaptureMode()
.
Retraso sin obturador
A partir de la versión 1.2, el retraso sin obturador (CAPTURE_MODE_ZERO_SHOT_LAG
) está disponible como modo de captura.
Con el retraso sin obturador habilitado, la latencia se reduce significativamente en comparación con el modo de captura predeterminado, CAPTURE_MODE_MINIMIZE_LATENCY
, para que nunca te pierdas la foto.
El retraso sin obturador utiliza un búfer de anillo que almacena los tres marcos de captura más recientes. Cuando el usuario presiona el botón de captura, CameraX invoca a takePicture()
, y el búfer de anillo recupera el marco capturado con la marca de tiempo más cercana a la de presionar el botón. CameraX luego reprocesa la sesión de captura para generar una imagen a partir de ese marco, que se guarda en el disco en formato JPEG.
Requisitos previos
Antes de habilitar el retraso sin obturador, usa isZslSupported()
para determinar si el dispositivo cumple con los siguientes requisitos:
- Se orienta a Android 6.0 y versiones posteriores (nivel de API 23 y versiones posteriores).
- Admite el reprocesamiento de
PRIVATE
.
En el caso de los dispositivos que no cumplen con los requisitos mínimos, CameraX recurre a CAPTURE_MODE_MINIMIZE_LATENCY
.
El retraso sin obturador solo está disponible para el caso de uso de captura de imágenes.
No puedes habilitarlo para el caso de uso de captura de video ni con extensiones de cámara.
Por último, debido a que el uso de flash da como resultado una mayor latencia, el retraso sin obturador no funciona cuando el flash está ACTIVADO ni en modo AUTOMÁTICO.
Para obtener más información sobre cómo configurar el modo de flash, consulta setFlashMode()
.
Cómo habilitar el retraso sin obturador
Para habilitar el retraso sin obturador, pasa CAPTURE_MODE_ZERO_SHOT_LAG
a ImageCapture.Builder.setCaptureMode()
. Si no funciona, setCaptureMode()
regresa a CAPTURE_MODE_MINIMIZE_LATENCY
.
setFlashMode()
El modo de flash predeterminado es FLASH_MODE_OFF
. Para configurar el modo de flash, usa ImageCapture.Builder.setFlashMode()
:
FLASH_MODE_ON
: El flash está siempre activado.FLASH_MODE_AUTO
: El flash está activado automáticamente para las tomas con poca luz.
Cómo tomar una foto
En la siguiente muestra de código, se ve cómo configurar la app para que tome una foto.
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);
Ten en cuenta que bindToLifecycle()
muestra un objeto Camera
. Consulta esta guía para obtener más información para controlar la salida de la cámara, como el zoom y la exposición.
Una vez configurada la cámara, el siguiente código toma una foto en función de la acción del usuario.
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. } } ); }
El método de captura de imágenes es compatible con el formato JPEG
. Para ver un código de muestra en el que se indica cómo convertir un objeto Media.Image
del formato YUV_420_888
a un objeto Bitmap
RGB, consulta YuvToRgbConverter.kt
.
Recursos adicionales
Para obtener más información acerca de CameraX, consulta los siguientes recursos adicionales.
Codelab
Muestra de código