Bildaufnahme

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:

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 bereitgestellten OnImageCapturedCallback().
  • 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:

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:

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

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

  • <ph type="x-smartling-placeholder"></ph> Erste Schritte mit CameraX
  • Codebeispiel

  • <ph type="x-smartling-placeholder"></ph> Beispiel-Apps für CameraX