Acquisizione di immagini

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:

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'elemento OnImageCapturedCallback() fornito dall'utente.
  • Se il chiamante sceglie di salvare l'immagine in un percorso di 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, ritardo otturatore e altro ancora.

setCaptureMode()

Utilizza ImageCapture.Builder.setCaptureMode() per configurare la modalità di acquisizione quando scatti una foto:

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 la funzionalità zero-Shutter Lag, 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 versioni successive).
  • 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

  • Iniziare a usare CameraX
  • Esempio di codice

  • Esempi di app CameraX