Questa pagina descrive come acquisire immagini di alta qualità con CameraX. Per farlo,
utilizza la classe ImageCapture e i relativi metodi.
Concetti fondamentali
Di seguito sono riportati i concetti principali trattati in questo documento:
- Metodo di archiviazione: puoi acquisire immagini in un buffer in memoria o direttamente in un file.
- Esecutori:
ImageCaptureutilizza gli esecutori per la gestione dei callback e delle operazioni di I/O. Puoi personalizzare questi executor per migliorare le prestazioni e il controllo. - Modalità di acquisizione: puoi configurare la modalità di acquisizione per ottimizzare la latenza o la qualità dell'immagine.
Metodo di archiviazione
Esistono due modi per acquisire immagini con
ImageCapture. Ognuno utilizza un sovraccarico di ImageCapture.takePicture():
File: utilizza
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)per salvare l'immagine acquisita direttamente in un file sul disco.- Questo è il modo più comune per scattare foto.
In memoria:utilizza
takePicture(Executor, OnImageCapturedCallback)per ricevere un buffer in memoria dell'immagine acquisita.- Questo approccio è utile per l'elaborazione o l'analisi delle immagini in tempo reale.
Esecutori
Quando chiami takePicture, passi un Executor e una funzione OnImageCapturedCallback o OnImageSavedCallback. Executor
esegue il callback e gestisce qualsiasi I/O risultante.
Scatta foto
Per scattare una foto, configura la videocamera e poi chiama takePicture.
Configurare la videocamera
Per configurare la videocamera, crea un CameraProvider. Poi, crea un oggetto
ImageCapture. Utilizza ImageCapture.Builder():
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
Scatta una foto
Dopo aver configurato la videocamera, chiama takePicture() per acquisire un'immagine.
Questo esempio mostra come utilizzare takePicture() per salvare un'immagine
su 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 } } ) }
Ecco i punti chiave di questo snippet:
ImageCapture.OutputFileOptionsti consente di configurare la posizione di salvataggio e i metadati.- In questo caso,
OutputFileOptions.Builder()utilizza un oggettoFileper determinare la posizione di salvataggio.
- In questo caso,
- La funzione
takePicture()acquisisce l'immagine in modo asincrono utilizzando le opzioni e l'executor forniti. OnImageSavedCallbackfornisce callback per esito positivo e negativo.- Il callback
onImageSaved()gestisce l'acquisizione riuscita dell'immagine e fornisce l'accesso ai risultati dell'immagine salvata. - Il callback
onError()gestisce gli errori di acquisizione delle immagini.
- Il callback
Opzioni aggiuntive
Consulta la Guida alla configurazione per l'ottimizzazione, il flash e il formato dei file per altri
modi per configurare ImageCapture.
Ulteriori risorse
Per saperne di più su CameraX, consulta le seguenti risorse:
Codelab
Esempio di codice