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 :
takePicture(Executor, OnImageCapturedCallback)
: cette méthode fournit un tampon en mémoire de l'image capturée.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: cette méthode enregistre l'image capturée à l'emplacement indiqué.
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 constructeurOnImageCapturedCallback()
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 :
CAPTURE_MODE_MINIMIZE_LATENCY
: optimiser la capture d'image pour la latence.CAPTURE_MODE_MAXIMIZE_QUALITY
: optimiser la capture d'image pour la qualité.
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
Exemple de code