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.
Implementación
Se proporcionan controles básicos para tomar fotos. Las fotos se toman con opciones de flash y enfoque automático continuo.
Con el fin de optimizar la captura de fotos para latencia, configura ImageCapture.CaptureMode
en CAPTURE_MODE_MINIMIZE_LATENCY
.
Para optimizar la calidad, configúrala en CAPTURE_MODE_MAXIMIZE_QUALITY
.
En el siguiente código, se muestra cómo configurar tu app para tomar 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);
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.OnImageSavedListener() { @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