Captura de imágenes

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:

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 elemento OnImageCapturedCallback() 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:

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():

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 a fin de 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

  • Cómo comenzar a usar CameraX
  • Muestra de código

  • Apps de ejemplo de CameraX