Il caso d'uso di acquisizione delle immagini è progettato per acquisire immagini ad alta risoluzione, foto di alta qualità e garantiscono bilanciamento automatico del bianco, esposizione automatica e funzionalità di messa a fuoco automatica (3A), oltre a semplici controlli manuali della fotocamera. Il chiamante è responsabile di decidere come usare l'immagine acquisita, incluse le seguenti opzioni:
takePicture(Executor, OnImageCapturedCallback)
: Questo metodo fornisce un buffer in memoria dell'immagine acquisita.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Questo metodo salva l'immagine acquisita nel percorso del file fornito.
Esistono due tipi di esecutori personalizzabili su cui viene eseguito ImageCapture
,
l'esecutore callback e l'esecutore IO.
- L'esecutore del callback è il parametro dei metodi
takePicture
. È utilizzato per eseguire l'elementoOnImageCapturedCallback()
fornito dall'utente. - Se il chiamante sceglie di salvare l'immagine in un percorso file, è possibile specificare
a un esecutore per eseguire l'IO. Per impostare l'esecutore IO, richiama
ImageCapture.Builder.setIoExecutor(Executor)
Se l'esecutore non è presente, CameraX utilizzerà per impostazione predefinita un esecutore I/O interno per l'attività.
Configura l'acquisizione di immagini
L'acquisizione di immagini offre controlli di base per scattare foto, come flash, messa a fuoco automatica continua, tempo di otturatore e altro ancora.
setCaptureMode()
Utilizza ImageCapture.Builder.setCaptureMode()
per configurare la modalità di acquisizione quando scatti una foto:
CAPTURE_MODE_MINIMIZE_LATENCY
: ottimizza l'acquisizione delle immagini per la latenza.CAPTURE_MODE_MAXIMIZE_QUALITY
: ottimizza l'acquisizione delle immagini per la qualità delle immagini.
La modalità di acquisizione è impostata automaticamente su CAPTURE_MODE_MINIMIZE_LATENCY
.
Per saperne di più, consulta la documentazione di riferimento di setCaptureMode()
.
Zero-Shutter Lag
A partire dalla versione 1.2, la modalità Zero-Shutter Lag (CAPTURE_MODE_ZERO_SHOT_LAG
) è disponibile come modalità di acquisizione.
Con la funzionalità zero-Shutter Lag attivata, la latenza è notevolmente ridotta rispetto alla modalità di acquisizione predefinita, CAPTURE_MODE_MINIMIZE_LATENCY
, per non perdere mai l'inquadratura.
Zero-Shutter Lag utilizza un buffer ad anello che memorizza i tre fotogrammi di acquisizione più recenti. Quando un utente preme il pulsante di acquisizione, CameraX richiama takePicture()
e il buffer ad anello recupera il fotogramma acquisito con il timestamp più vicino a quello della pressione del pulsante. CameraX rielabora quindi la sessione di acquisizione per generare un'immagine da quel frame, che viene salvata su disco in formato JPEG.
Prerequisiti
Prima di attivare il ritardo dello scatto, utilizza isZslSupported()
per determinare se il tuo dispositivo soddisfa i seguenti requisiti:
- Ha come target Android 6.0 o versioni successive (livello API 23 e successivi).
- Supporta la rielaborazione di
PRIVATE
.
Per i dispositivi che non soddisfano i requisiti minimi, CameraX utilizza il valore CAPTURE_MODE_MINIMIZE_LATENCY
.
La funzionalità Zero-Shutter Lag è disponibile solo per il caso d'uso Acquisizione di immagini.
Non puoi abilitarla per Acquisizione video
o con le estensioni Fotocamera.
Infine, dato che l'uso di Flash comporta una maggiore latenza,
Zero-Shutter Lag non funziona quando il flash è attivato o in modalità AUTO.
Per ulteriori informazioni sull'impostazione della modalità flash, vedi setFlashMode()
.
Attiva ritardo otturatore
Per attivare il ritardo dello scatto, passa CAPTURE_MODE_ZERO_SHOT_LAG
a ImageCapture.Builder.setCaptureMode()
. In caso contrario, setCaptureMode()
utilizza CAPTURE_MODE_MINIMIZE_LATENCY
.
setFlashMode()
La modalità flash predefinita è FLASH_MODE_OFF
. Per impostare la modalità flash, utilizza ImageCapture.Builder.setFlashMode()
:
FLASH_MODE_ON
: il flash è sempre attivo.FLASH_MODE_AUTO
: il flash viene attivato automaticamente per gli scatti in condizioni di scarsa illuminazione.
Scatta foto
Il seguente esempio di codice mostra come configurare l'app in modo da scattare 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);
Tieni presente che bindToLifecycle()
restituisce un oggetto Camera
. Consulta questa guida per ulteriori informazioni su come controllare l'output della fotocamera, ad esempio lo zoom e l'esposizione.
Una volta configurata la fotocamera, il seguente codice scatta una foto in base azione utente:
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. } } ); }
Il metodo di acquisizione delle immagini supporta pienamente
JPEG
. Per il codice campione
che mostra come convertire un elemento Media.Image
oggetto dal formato YUV_420_888
a un RGB
Bitmap
, consulta
YuvToRgbConverter.kt
Risorse aggiuntive
Per saperne di più su CameraX, consulta le risorse aggiuntive che seguono.
Codelab
Esempio di codice