Cómo capturar una imagen

En esta página, se describe cómo capturar imágenes de alta calidad con CameraX. Para ello, usa la clase ImageCapture y sus métodos asociados.

Conceptos clave

Los siguientes son los conceptos principales que se analizan en este documento:

  • Método de almacenamiento: Puedes capturar imágenes en un búfer en la memoria o directamente en un archivo.
  • Ejecutores: ImageCapture usa ejecutores para controlar devoluciones de llamada y operaciones de E/S. Puedes personalizar estos ejecutores para mejorar el rendimiento y el control.
  • Modos de captura: Puedes configurar el modo de captura para optimizar la latencia o la calidad de la imagen.

Método de almacenamiento

Existen dos maneras de capturar imágenes con ImageCapture. Cada uno usa una sobrecarga de ImageCapture.takePicture():

Ejecutores

Cuando llamas a takePicture, pasas un Executor y una función OnImageCapturedCallback o OnImageSavedCallback. Executor ejecuta la devolución de llamada y controla cualquier E/S resultante.

Cómo tomar una foto

Para tomar una foto, configura la cámara y, luego, llama a takePicture.

Cómo configurar la cámara

Para configurar la cámara, crea un CameraProvider. Luego, crea un objeto ImageCapture. Usa ImageCapture.Builder():

Kotlin

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

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

Java

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

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

Tomar una foto

Después de configurar la cámara, llama a takePicture() para capturar una imagen. En este ejemplo, se muestra cómo usar takePicture() para guardar una imagen en el disco:

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

Estos son los puntos clave de este fragmento:

  • ImageCapture.OutputFileOptions te permite configurar la ubicación de guardado y los metadatos.
    • Aquí, OutputFileOptions.Builder() usa un objeto File para determinar la ubicación de guardado.
  • La función takePicture() captura la imagen de forma asíncrona con las opciones y el ejecutor proporcionados.
  • OnImageSavedCallback proporciona devoluciones de llamada para el éxito y el fracaso.
    • La devolución de llamada onImageSaved() controla la captura de imágenes correcta y proporciona acceso a los resultados de las imágenes guardadas.
    • La devolución de llamada onError() controla los errores de captura de imágenes.

Opciones adicionales

Consulta la guía de configuración para optimización, formato de archivo y flash para conocer otras formas de configurar ImageCapture.

Más recursos

Para obtener más información sobre CameraX, consulta los siguientes recursos:

Codelab

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

  • Apps de ejemplo de CameraX