Bildaufnahme

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:

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 bereitgestellte OnImageCapturedCallback() 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:

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:

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:

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

  • Erste Schritte mit CameraX
  • Codebeispiel

  • CameraX-Beispiel-Apps