Acquisizione di immagini

Il caso d'uso di acquisizione delle immagini è progettato per scattare foto ad alta risoluzione e di alta qualità e offre funzionalità di bilanciamento automatico del bianco, esposizione automatica e messa a fuoco automatica (3A), oltre a semplici controlli manuali della fotocamera. Il chiamante è responsabile di decidere come utilizzare l'immagine acquisita, incluse le seguenti opzioni:

Esistono due tipi di esecutori personalizzabili su cui viene eseguito ImageCapture: l'esecutore di callback e l'esecutore di I/O.

  • L'esecutore di callback è il parametro dei metodi takePicture. Viene utilizzato per eseguire l'elemento OnImageCapturedCallback() fornito dall'utente.
  • Se il chiamante sceglie di salvare l'immagine in un percorso del file, puoi specificare un esecutore per l'IO. Per impostare l'esecutore di I/O, chiama ImageCapture.Builder.setIoExecutor(Executor). Se l'esecutore non è presente, CameraX utilizzerà per impostazione predefinita un esecutore IO interno per l'attività.

Configura l'acquisizione delle immagini

L'acquisizione di immagini offre controlli di base per scattare foto, come flash, messa a fuoco automatica continua, ritardo di scatto zero e altro ancora.

setCaptureMode()

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

L'impostazione predefinita della modalità di acquisizione è CAPTURE_MODE_MINIMIZE_LATENCY. Per saperne di più, consulta la documentazione di riferimento di setCaptureMode().

Tempo di attesa zero

A partire dalla versione 1.2, il ritardo di scatto zero (CAPTURE_MODE_ZERO_SHOT_LAG) è disponibile come modalità di acquisizione. Con il tempo di attesa zero attivato, la latenza è notevolmente ridotta rispetto alla modalità di acquisizione predefinita, CAPTURE_MODE_MINIMIZE_LATENCY, in modo da non perdere mai lo scatto.

Zero-Shutter Lag utilizza un ring buffer che memorizza i tre fotogrammi di acquisizione più recenti. Quando un utente preme il pulsante di acquisizione, CameraX richiama takePicture() e il ring buffer recupera il fotogramma acquisito con il timestamp più vicino a quello del pulsante premuto. A questo punto, CameraX rielabora la sessione di acquisizione per generare un'immagine da quel frame, che viene salvata su disco in formato JPEG.

Prerequisiti

Prima di attivare il tempo di attesa zero, utilizza isZslSupported() per determinare se il tuo dispositivo soddisfa i seguenti requisiti:

  • Ha come target Android 6.0 e versioni successive (livello API 23 e livelli successivi).
  • Supporta la rielaborazione di PRIVATE.

Per i dispositivi che non soddisfano i requisiti minimi, CameraX torna a CAPTURE_MODE_MINIMIZE_LATENCY.

Il ritardo di scatto zero è disponibile solo per il caso d'uso dell'acquisizione di immagini. Non puoi abilitarla per il caso d'uso Acquisizione video o con le estensioni Fotocamera. Infine, poiché l'utilizzo del flash determina una maggiore latenza, il ritardo zero dell'otturatore non funziona quando il flash è acceso o in modalità AUTO. Per ulteriori informazioni sull'impostazione della modalità flash, vedi setFlashMode().

Attiva ritardo di scatto zero

Per attivare il tempo di attesa zero, passa CAPTURE_MODE_ZERO_SHOT_LAG a ImageCapture.Builder.setCaptureMode(). Se l'operazione non va a buon fine, setCaptureMode() torna a CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

La modalità flash predefinita è FLASH_MODE_OFF. Per impostare la modalità flash, utilizza ImageCapture.Builder.setFlashMode():

  • FLASH_MODE_ON: 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 per 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, come lo zoom e l'esposizione.

Una volta configurata la fotocamera, il seguente codice scatta una foto in base all'azione dell'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 completamente il formato JPEG. Per un codice di esempio che mostra come convertire un oggetto Media.Image dal formato YUV_420_888 in un oggetto Bitmap RGB, consulta YuvToRgbConverter.kt.

Risorse aggiuntive

Per saperne di più su CameraX, consulta le seguenti risorse aggiuntive.

Codelab

  • Introduzione a CameraX
  • Esempio di codice

  • Esempi di app CameraX