Auf dieser Seite wird beschrieben, wie Sie mit CameraX hochwertige Bilder aufnehmen. Dazu verwenden Sie die Klasse ImageCapture und die zugehörigen Methoden.
Wichtige Konzepte
Im Folgenden werden die wichtigsten Konzepte erläutert, die in diesem Dokument behandelt werden:
- Speichermethode:Sie können Bilder entweder in einem In-Memory-Puffer oder direkt in einer Datei aufnehmen.
- Executors:
ImageCaptureverwendet Executors für die Verarbeitung von Callbacks und E/A-Vorgängen. Sie können diese Executors anpassen, um die Leistung und Steuerung zu verbessern. - Aufnahmemodi:Sie können den Aufnahmemodus so konfigurieren, dass entweder die Latenz oder die Bildqualität optimiert wird.
Speichermethode
Es gibt zwei Möglichkeiten, Bilder mit ImageCapture aufzunehmen. Sie verwenden jeweils eine Überladung von ImageCapture.takePicture():
Datei:Verwenden Sie
takePicture(OutputFileOptions, Executor, OnImageSavedCallback), um das aufgenommene Bild direkt in einer Datei auf der Festplatte zu speichern.- Das ist die gängigste Methode zum Aufnehmen von Fotos.
Im Arbeitsspeicher: Verwenden Sie
takePicture(Executor, OnImageCapturedCallback), um einen Puffer des aufgenommenen Bildes im Arbeitsspeicher zu erhalten.- Das ist nützlich für die Bildverarbeitung oder ‑analyse in Echtzeit.
Executors
Wenn Sie takePicture aufrufen, übergeben Sie ein Executor und entweder eine OnImageCapturedCallback- oder eine OnImageSavedCallback-Funktion. Die Executor führt den Callback aus und verarbeitet alle resultierenden E/A-Vorgänge.
Foto aufnehmen
Um ein Foto aufzunehmen, richten Sie die Kamera ein und rufen dann takePicture auf.
Kamera einrichten
Erstelle ein CameraProvider, um die Kamera einzurichten. Erstellen Sie dann ein ImageCapture-Objekt. ImageCapture.Builder() verwenden:
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
Foto machen
Nachdem Sie die Kamera konfiguriert haben, rufen Sie takePicture() auf, um ein Bild aufzunehmen.
In diesem Beispiel wird gezeigt, wie Sie takePicture() verwenden, um ein Bild auf der Festplatte zu speichern:
fun onClick() { val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File("photo.jpg")).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 } } ) }
Hier sind die wichtigsten Punkte zu diesem Snippet:
- Mit dem
ImageCapture.OutputFileOptionskönnen Sie den Speicherort und die Metadaten konfigurieren.- Hier verwendet
OutputFileOptions.Builder()einFile-Objekt, um den Speicherort zu bestimmen.
- Hier verwendet
- Die Funktion
takePicture()nimmt das Bild asynchron mit den angegebenen Optionen und dem Executor auf. - Das
OnImageSavedCallbackbietet Callbacks für Erfolg und Fehler.- Der
onImageSaved()-Callback verarbeitet erfolgreiche Bildaufnahmen und bietet Zugriff auf die Ergebnisse der gespeicherten Bilder. - Der
onError()-Callback verarbeitet Fehler bei der Bildaufnahme.
- Der
Zusätzliche Optionen
Im Leitfaden zum Konfigurieren für Optimierung, Flash und Dateiformat finden Sie weitere Möglichkeiten zum Konfigurieren von ImageCapture.
Weitere Ressourcen
Weitere Informationen zu CameraX finden Sie in den folgenden Ressourcen:
Codelab
Codebeispiel