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()
:
Archivo: Usa
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
para guardar la imagen capturada directamente en un archivo en el disco.- Esta es la forma más común de capturar fotos.
En la memoria: Usa
takePicture(Executor, OnImageCapturedCallback)
para recibir un búfer en la memoria de la imagen capturada.- Esto es útil para el procesamiento o el análisis de imágenes en tiempo real.
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 objetoFile
para 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. 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.
- La devolución de llamada
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
Muestra de código