Der Anwendungsfall Bilderfassung wurde für die Erfassung hoher Auflösung, Fotos in hoher Qualität aufnehmen und den automatischen Weißabgleich, die automatische Belichtung Autofokus (3A) sowie eine einfache manuelle Kamerasteuerung. Der Anrufer entscheidet selbst, wie er das aufgenommene Bild verwenden möchte, einschließlich der folgenden Optionen:
takePicture(Executor, OnImageCapturedCallback)
: Diese Methode stellt einen Zwischenspeicher des erfassten Bildes im Speicher 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:
den Callback-Executor und den E/A-Executor.
- Der Callback-Executor ist der Parameter der
takePicture
-Methoden. Es ist zur Ausführung der vom Nutzer bereitgestelltenOnImageCapturedCallback()
. - Wenn sich der Anrufer dafür entscheidet, das Bild an einem Dateispeicherort zu speichern, können Sie
einen Executor für die E/A erstellt. Rufen Sie zum Festlegen des E/A-Executors
ImageCapture.Builder.setIoExecutor(Executor)
Wenn der Executor nicht vorhanden ist, verwendet CameraX einen internen E/A-Executor für die Aufgabe zu erledigen.
Bilderfassung einrichten
Die Bilderfassung bietet grundlegende Steuerelemente für die Aufnahme von Fotos, wie Blitz, kontinuierlicher Autofokus und ohne Blendenverzögerung.
setCaptureMode()
ImageCapture.Builder.setCaptureMode()
verwenden
um den Aufnahmemodus beim Aufnehmen eines Fotos zu konfigurieren:
CAPTURE_MODE_MINIMIZE_LATENCY
: Optimiert die Bilderfassung für Latenz.CAPTURE_MODE_MAXIMIZE_QUALITY
: Optimiert die Bildaufnahme im Hinblick auf die Bildqualität.
Der Aufnahmemodus ist standardmäßig auf CAPTURE_MODE_MINIMIZE_LATENCY
eingestellt.
Weitere Informationen finden Sie in der Referenzdokumentation zu setCaptureMode()
.
Null-Auslöser-Verzögerung
Ab Version 1.2 ist die Zero-Auslöser-Verzögerung (CAPTURE_MODE_ZERO_SHOT_LAG
) als Aufnahmemodus verfügbar.
Wenn die Zero-Auslöser-Verzögerung aktiviert ist, wird die Latenz im Vergleich zum Standardaufnahmemodus CAPTURE_MODE_MINIMIZE_LATENCY
deutlich reduziert, damit Sie keine Aufnahme verpassen.
Bei Zero-Shutter-Verzögerung wird ein Ringpuffer verwendet, in dem die drei letzten Aufnahmen gespeichert werden. Wenn ein Nutzer 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 Schaltfläche am nächsten kommt. CameraX verarbeitet dann die Aufnahme neu, um aus diesem Frame ein Bild zu generieren, das im JPEG-Format auf der Festplatte gespeichert wird.
Voraussetzungen
Bevor Sie die Verzögerung ohne Auslöser aktivieren, prüfen Sie mit isZslSupported()
, ob Ihr Gerät die folgenden Anforderungen erfüllt:
- Ausrichtung auf Android 6.0 und höher (API-Level 23 und höher).
- Unterstützt die erneute Verarbeitung von
PRIVATE
.
Bei Geräten, die die Mindestanforderungen nicht erfüllen, greift CameraX auf CAPTURE_MODE_MINIMIZE_LATENCY
zurück.
Keine Verzögerung ist nur für den Anwendungsfall Bilderfassung verfügbar.
Sie kann nicht für die Videoaufnahme aktiviert werden.
oder mit Kameraerweiterungen.
Da Flash zu einer höheren Latenz führt,
Die Zero-Auslöser-Verzögerung funktioniert nicht, wenn der Blitz aktiviert oder der Modus AUTOMATISCH aktiviert ist.
Weitere Informationen zum Einstellen des Blitzmodus finden Sie unter setFlashMode()
.
Null-Auslöser-Verzögerung aktivieren
Wenn Sie die Verzögerung ohne Verschluss aktivieren möchten, übergeben Sie CAPTURE_MODE_ZERO_SHOT_LAG
an ImageCapture.Builder.setCaptureMode()
. Wenn der Vorgang nicht erfolgreich ist, wird setCaptureMode()
auf CAPTURE_MODE_MINIMIZE_LATENCY
zurückgesetzt.
setFlashMode()
Der standardmäßige Blitzmodus ist FLASH_MODE_OFF
. Verwenden Sie zum Einstellen des Blitzmodus ImageCapture.Builder.setFlashMode()
:
FLASH_MODE_ON
: Flash ist immer aktiviert.FLASH_MODE_AUTO
: Der Blitz ist bei schwachen Lichtverhältnissen automatisch aktiviert.
Foto aufnehmen
Das folgende Codebeispiel zeigt, wie Sie Ihre App für die Aufnahme von 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. In dieser Anleitung findest du weitere Informationen zur Steuerung der Kameraausgabe, wie z. B. Zoom und Belichtung.
Nachdem Sie die Kamera konfiguriert haben, wird mit dem folgenden Code ein Foto Nutzeraktion:
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. } } ); }
Bei der Bilderfassungsmethode werden die
JPEG
-Format. Für Beispielcode
in dem Sie erfahren, wie Sie ein Media.Image
Objekt vom YUV_420_888
-Format in ein RGB-Format
Bitmap
-Objekt, siehe
YuvToRgbConverter.kt
Weitere Informationen
Weitere Informationen zu CameraX finden Sie in den folgenden Ressourcen.
Codelab
Codebeispiel