Capture d'image

Le cas d'utilisation de capture d'image est conçu pour les photos en haute résolution et haute qualité. Il offre des fonctionnalités de balance des blancs automatique, d'exposition automatique et d'autofocus (3A), en plus des commandes manuelles classiques d'un appareil photo. Il appartient à l'appelant de déterminer comment utiliser la photo capturée. Les options suivantes sont disponibles :

Il existe deux types d'exécuteurs personnalisables sur lesquels ImageCapture s'exécute : l'exécuteur de rappels et l'exécuteur d'E/S.

  • L'exécuteur de rappels est le paramètre des méthodes takePicture. Il est utilisé pour exécuter le constructeur OnImageCapturedCallback() fourni par l'utilisateur.
  • Si l'appelant choisit d'enregistrer l'image dans un emplacement de fichier, vous pouvez spécifier un exécuteur pour effectuer les E/S. Pour définir l'exécuteur d'E/S, appelez ImageCapture.Builder.setIoExecutor(Executor). Si l'exécuteur est absent, CameraX utilise par défaut un exécuteur d'E/S interne pour la tâche.

Configurer la capture d'image

La capture d'image fournit des commandes de base pour prendre des photos, comme le flash, l'autofocus en continu, le déclenchement instantané, etc.

setCaptureMode()

Utilisez ImageCapture.Builder.setCaptureMode() pour configurer le mode de capture lorsque vous prenez une photo :

Le mode de capture est défini par défaut sur CAPTURE_MODE_MINIMIZE_LATENCY. Pour plus d'informations, consultez la documentation de référence de setCaptureMode().

Déclenchement instantané

À partir de la version 1.2, le déclenchement instantané (CAPTURE_MODE_ZERO_SHOT_LAG) est disponible comme mode de capture. En activant le déclenchement instantané, vous réduisez considérablement la latence par rapport au mode de capture par défaut, CAPTURE_MODE_MINIMIZE_LATENCY, afin de ne jamais rater la photo.

Ce mode utilise un tampon circulaire qui stocke les trois frames de capture les plus récents. Lorsqu'un utilisateur appuie sur le bouton de capture, CameraX appelle takePicture() et le tampon circulaire récupère le frame capturé avec le code temporel le plus proche de celui où le bouton a été enfoncé. CameraX traite à nouveau la session de capture pour générer une image à partir de ce frame, qui est enregistrée au format JPEG.

Conditions préalables

Avant d'activer le déclenchement instantané, utilisez isZslSupported() pour déterminer si votre appareil répond aux exigences suivantes :

  • Ciblage d'Android 6.0 et versions ultérieures (niveau d'API 23 ou plus)
  • Prise en charge du retraitement PRIVATE

Pour les appareils qui ne remplissent pas les conditions minimales requises, CameraX utilise CAPTURE_MODE_MINIMIZE_LATENCY.

Le déclenchement instantané n'est disponible que pour le cas d'utilisation Capture d'image. Vous ne pouvez pas l'activer pour le cas d'utilisation Capture vidéo ni avec les Extensions pour l'appareil photo. Enfin, comme l'utilisation du flash entraîne une latence accrue, le déclenchement instantané ne fonctionne pas lorsque le flash est activé ou en mode AUTO. Pour savoir comment définir le mode flash, consultez setFlashMode().

Activer le déclenchement instantané

Pour activer le déclenchement instantané, transmettez CAPTURE_MODE_ZERO_SHOT_LAG à ImageCapture.Builder.setCaptureMode(). Si l'opération échoue, setCaptureMode() utilise CAPTURE_MODE_MINIMIZE_LATENCY.

setFlashMode()

Le mode flash par défaut est FLASH_MODE_OFF. Pour définir le mode flash, utilisez ImageCapture.Builder.setFlashMode() :

  • FLASH_MODE_ON : le flash est toujours activé.
  • FLASH_MODE_AUTO : le flash est automatiquement activé pour les prises de vue dans des conditions de faible éclairage.

Prendre une photo

L'exemple de code suivant montre comment configurer votre application pour prendre une photo :

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);

Notez que bindToLifecycle() renvoie un objet Camera. Pour en savoir plus sur le contrôle de la sortie de l'appareil photo, comme le zoom et l'exposition, consultez ce guide.

Une fois que vous avez configuré l'appareil photo, le code suivant prend une photo en fonction de l'action effectuée par l'utilisateur :

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.
            }
       }
    );
}

La méthode de capture d'image est entièrement compatible avec le format JPEG. Pour obtenir un exemple de code expliquant comment convertir un objet Media.Image au format YUV_420_888 en objet Bitmap RVB, consultez YuvToRgbConverter.kt.

Ressources supplémentaires

Pour en savoir plus sur CameraX, consultez les ressources supplémentaires suivantes.

Atelier de programmation

  • Premiers pas avec CameraX
  • Exemple de code

  • Applications exemples de CameraX