Questa pagina descrive come acquisire immagini di alta qualità con CameraX. Puoi farlo con la classe ImageCapture
e i relativi metodi associati.
Concetti principali
Di seguito sono riportati i concetti principali trattati in questo documento:
- Metodo di archiviazione: puoi acquisire le immagini in un buffer in memoria o direttamente in un file.
- Esecutori:
ImageCapture
utilizza gli esecutori per gestire i callback e le operazioni di I/O. Puoi personalizzare questi executor per migliorare il rendimento e il controllo. - Modalità di acquisizione: puoi configurare la modalità di acquisizione in modo da 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: usa
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 testamentari
Quando chiami takePicture
, passi un Executor
e una funzione OnImageCapturedCallback
o OnImageSavedCallback
. Executor
esegue il callback e gestisce l'eventuale I/O risultante.
Scatta foto
Per scattare una foto, imposta la fotocamera e chiama takePicture
.
Configura la videocamera
Per configurare la videocamera, crea un CameraProvider
. Poi, crea un oggetto
ImageCapture
. Utilizza 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);
Scatta una foto
Dopo aver configurato la videocamera, chiama takePicture()
per acquisire un'immagine.
Questo esempio mostra come utilizzare takePicture()
per salvare un'immagine sul 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.
}
}
);
}
Ecco i punti chiave di questo snippet:
ImageCapture.OutputFileOptions
consente di configurare la posizione di salvataggio e i metadati.- Qui,
OutputFileOptions.Builder()
utilizza un oggettoFile
per determinare la posizione di salvataggio.
- Qui,
- La funzione
takePicture()
acquisisce l'immagine in modo asincrono utilizzando le opzioni e l'executor forniti. OnImageSavedCallback
fornisce i callback per i casi di successo e di errore.- Il callback
onImageSaved()
gestisce l'acquisizione di immagini riuscite e fornisce accesso ai risultati delle immagini salvate. - Il callback
onError()
gestisce gli errori di acquisizione delle immagini.
- Il callback
Opzioni aggiuntive
Consulta la guida alla configurazione per ottimizzazione, flash e formato file per scoprire altri modi per configurare ImageCapture
.
Ulteriori risorse
Per scoprire di più su CameraX, consulta le seguenti risorse:
Codelab
Esempio di codice