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
A continuación, se indican 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:
ImageCaptureusa ejecutores para controlar las devoluciones de llamada y las operaciones de E/S. Puedes personalizar estos ejecutores para obtener un mejor rendimiento y 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 formas de capturar imágenes con ImageCapture. Cada uno usa una sobrecarga de ImageCapture.takePicture():
File: Usa
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)para guardar la imagen capturada directamente en un archivo del disco.- Esta es la forma más común de tomar fotos.
En memoria: Usa
takePicture(Executor, OnImageCapturedCallback)para recibir un búfer en la memoria de la imagen capturada.- Esto es útil para el procesamiento o análisis de imágenes en tiempo real.
Ejecutores
Cuando llamas a takePicture, pasas un Executor y una función OnImageCapturedCallback o OnImageSavedCallback. El Executor ejecuta la devolución de llamada y controla cualquier E/S resultante.
Tomar foto
Para tomar una foto, debes configurar la cámara y, luego, llamar a takePicture.
Configura la cámara
Para configurar la cámara, crea un objeto CameraProvider. Luego, crea un objeto ImageCapture. Usa ImageCapture.Builder():
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .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:
fun onClick() { val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File("photo.jpg")).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 } } ) }
Estos son los puntos clave sobre este fragmento:
- El
ImageCapture.OutputFileOptionste permite configurar la ubicación de guardado y los metadatos.- Aquí,
OutputFileOptions.Builder()usa un objetoFilepara determinar la ubicación de guardado.
- Aquí,
- La función
takePicture()captura la imagen de forma asíncrona con las opciones y el ejecutor proporcionados. - El objeto
OnImageSavedCallbackproporciona 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 imágenes guardadas. - La devolución de llamada
onError()controla los errores de captura de imágenes.
- La devolución de llamada
Opciones adicionales
Consulta la guía de configuración para la optimización, el flash y el formato de archivo para conocer otras formas de configurar ImageCapture.
Más recursos
Para obtener más información sobre CameraX, consulta los siguientes recursos:
Codelab
Muestra de código