Der Anwendungsfall zur Bilderfassung ist für die Aufnahme hochauflösender Fotos in hoher Qualität gedacht und bietet neben einfachen manuellen Kamerasteuerungen auch Funktionen für automatischen Weißabgleich, automatische Belichtung und Autofokus (3A). Der Aufrufer ist selbst dafür verantwortlich, zu entscheiden, wie das aufgenommene Bild verwendet wird. Dazu gehören:
takePicture(Executor, OnImageCapturedCallback)
: Diese Methode stellt einen speicherinternen Zwischenspeicher des aufgenommenen Bildes bereit.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Bei dieser Methode wird das aufgenommene Bild am angegebenen Dateispeicherort gespeichert.
Es gibt zwei Arten von anpassbaren Executors, auf denen ImageCapture
ausgeführt wird: das Callback-Executor und der IO-Executor.
- Das Callback Executor ist der Parameter der
takePicture
-Methoden. Damit wird das vom Nutzer bereitgestellteOnImageCapturedCallback()
ausgeführt. - Wenn der Aufrufer das Image an einem Dateispeicherort speichert, können Sie einen Executor angeben, der die E/A ausführt. Rufen Sie
ImageCapture.Builder.setIoExecutor(Executor)
auf, um den E/A-Executor festzulegen. Wenn der Executor nicht vorhanden ist, verwendet CameraX für die Aufgabe standardmäßig einen internen E/A-Executor.
Bildaufnahme einrichten
Die Bilderfassung bietet grundlegende Funktionen für die Aufnahme von Bildern, zum Beispiel Blitz, kontinuierlicher Autofokus, Auslöser für Nullauslöser usw.
setCaptureMode()
Verwenden Sie ImageCapture.Builder.setCaptureMode()
, um den Aufnahmemodus beim Aufnehmen eines Fotos zu konfigurieren:
CAPTURE_MODE_MINIMIZE_LATENCY
: Die Bilderfassung wird im Hinblick auf Latenz optimiert.CAPTURE_MODE_MAXIMIZE_QUALITY
: Bildaufnahme für Bildqualität optimieren.
Die Standardeinstellung für den Aufnahmemodus ist CAPTURE_MODE_MINIMIZE_LATENCY
.
Weitere Informationen finden Sie in der Referenzdokumentation zu setCaptureMode()
.
Keine Verschlussverzögerung
Ab Version 1.2 ist die Funktion „Zero-Blend-Verzögerung“ (CAPTURE_MODE_ZERO_SHOT_LAG
) als Aufnahmemodus verfügbar.
Wenn die Funktion „Null-Auslöser-Verzögerung“ aktiviert ist, ist die Latenz im Vergleich zum standardmäßigen Aufnahmemodus CAPTURE_MODE_MINIMIZE_LATENCY
deutlich geringer – so verpasst du keine Aufnahme.
Bei der Null-Auslöseverzögerung wird ein Ringpuffer verwendet, der die drei letzten Aufnahmeframes speichert. Wenn ein Nutzer auf die Aufnahmeschaltfläche drückt, ruft CameraX takePicture()
auf und der Ringpuffer ruft den aufgenommenen Frame mit dem Zeitstempel ab, der dem beim Drücken der Taste am nächsten kommt. CameraX verarbeitet dann die Aufnahme noch einmal, um aus diesem Frame ein Bild zu generieren, das im JPEG-Format auf der Festplatte gespeichert wird.
Voraussetzungen
Bevor Sie die Null-Auslöseverzögerung aktivieren, verwenden Sie isZslSupported()
, um festzustellen, ob Ihr Gerät die folgenden Anforderungen erfüllt:
- Ist auf Android 6.0 und höher (API-Level 23 und höher) ausgerichtet.
- Unterstützt die erneute Verarbeitung von
PRIVATE
.
Bei Geräten, die die Mindestanforderungen nicht erfüllen, wird CameraX auf CAPTURE_MODE_MINIMIZE_LATENCY
zurückgesetzt.
Die Funktion „Null-Auslöseverzögerung“ ist nur für den Anwendungsfall Bilderaufnahme verfügbar.
Für den Anwendungsfall Videoaufnahme oder Kameraerweiterungen kann sie nicht aktiviert werden.
Weil die Verwendung von Blitz zu einer höheren Latenz führt, funktioniert die Null-Auslöseverzögerung nicht, wenn der Blitz eingeschaltet oder im automatischen Modus ist.
Weitere Informationen zum Einstellen des Blitzmodus finden Sie unter setFlashMode()
.
Verzögerung für Nullauslöser aktivieren
Übergeben Sie CAPTURE_MODE_ZERO_SHOT_LAG
an ImageCapture.Builder.setCaptureMode()
, um die Verzögerung für die Null-Blende zu aktivieren. Bei Erfolg wird setCaptureMode()
auf CAPTURE_MODE_MINIMIZE_LATENCY
zurückgesetzt.
setFlashMode()
Der Standardblitzmodus ist FLASH_MODE_OFF
. Verwenden Sie ImageCapture.Builder.setFlashMode()
, um den Blitzmodus einzustellen:
FLASH_MODE_ON
: Flash ist immer aktiviert.FLASH_MODE_AUTO
: Bei Aufnahmen bei schwachem Licht wird der Blitz automatisch aktiviert.
Foto aufnehmen
Das folgende Codebeispiel zeigt, wie Sie Ihre App für die Aufnahme eines Fotos konfigurieren:
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);
bindToLifecycle()
gibt ein Camera
-Objekt zurück. Weitere Informationen zur Steuerung der Kameraausgabe, z. B. Zoom und Belichtung, finden Sie in diesem Leitfaden.
Nachdem Sie die Kamera konfiguriert haben, nimmt der folgende Code ein Foto basierend auf der Nutzeraktion auf:
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. } } ); }
Die Bildaufnahmemethode unterstützt das JPEG
-Format vollständig. Beispielcode, der zeigt, wie ein Media.Image
-Objekt vom YUV_420_888
-Format in ein RGB-Bitmap
-Objekt konvertiert wird, findest du unter YuvToRgbConverter.kt
.
Weitere Informationen
Weitere Informationen zu CameraX finden Sie in den folgenden zusätzlichen Ressourcen.
Codelab
Codebeispiel