Przypadek użycia przechwytywania obrazów został zaprojektowany z myślą o rejestrowaniu obrazów w wysokiej rozdzielczości, wysokiej jakości zdjęcia, autobalans bieli, automatyczną ekspozycję autofokus (3A) oraz proste ręczne sterowanie aparatem. To rozmówca odpowiada za wybór sposobu wykorzystania zrobionego zdjęcia. w tym następujące opcje:
takePicture(Executor, OnImageCapturedCallback)
: Ta metoda zapewnia bufor w pamięci zrobionych zdjęć.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: Ta metoda powoduje zapisanie przechwyconego zdjęcia w podanej lokalizacji pliku.
Istnieją 2 typy możliwych do dostosowania ImageCapture
wykonawców:
wykonawcy wywołania zwrotnego i wykonawcy zamówienia reklamowego.
- Wykonawca wywołania zwrotnego jest parametrem metod
takePicture
. Jest służy do wykonywania podanego przez użytkownikaOnImageCapturedCallback()
. - Jeśli rozmówca zapisze obraz w lokalizacji pliku, możesz określić
wykonawcę zamówienia. Aby ustawić wykonawcę zamówienia reklamowego, wywołaj
ImageCapture.Builder.setIoExecutor(Executor)
Jeśli wykonawcy nie ma wykonawcy, CameraX domyślnie użyje wewnętrznego wykonawcy zamówienia reklamowego danego zadania.
Skonfiguruj robienie zdjęć
Funkcja przechwytywania obrazów udostępnia podstawowe funkcje sterowania takich jak lampa błyskowa, ciągły autofokus, opóźnienie migawki bez migawki i wiele innych.
setCaptureMode()
Użyj formatu ImageCapture.Builder.setCaptureMode()
aby skonfigurować tryb przechwytywania podczas robienia zdjęcia:
CAPTURE_MODE_MINIMIZE_LATENCY
: zoptymalizuj nagrywanie obrazów pod kątem opóźnienia.CAPTURE_MODE_MAXIMIZE_QUALITY
: zoptymalizuj robienie zdjęć pod kątem jakości.
Domyślny tryb przechwytywania to CAPTURE_MODE_MINIMIZE_LATENCY
.
Więcej informacji znajdziesz w dokumentacji referencyjnej setCaptureMode()
.
Opóźnienie migawki
Od wersji 1.2 Opóźnienie migawki (CAPTURE_MODE_ZERO_SHOT_LAG
) jest dostępne w trybie nagrywania.
Gdy włączona jest funkcja Zerowego opóźnienia migawki, opóźnienie jest znacznie mniejsze w porównaniu z domyślnym trybem nagrywania (CAPTURE_MODE_MINIMIZE_LATENCY
), dzięki czemu nigdy nie przegapisz ujęcia.
Opóźnienie przy braku migawki wykorzystuje bufor pierścienia, w którym zapisywane są 3 ostatnie klatki. Gdy użytkownik naciśnie przycisk przechwytywania, Aparat X wywołuje metodę takePicture()
, a bufor pierścienia pobiera przechwyconą klatkę z sygnaturą czasową najbliższą kliknięciu przycisku. Następnie CameraX ponownie przetwarza sesję przechwytywania, aby wygenerować na podstawie tej klatki obraz, który jest zapisywany na dysku w formacie JPEG.
Wymagania wstępne
Zanim włączysz brak opóźnienia migawki, sprawdź, czy Twoje urządzenie spełnia te wymagania: isZslSupported()
:
- Aplikacja jest kierowana na Androida 6.0 lub nowszego (poziom API 23 lub wyższy).
- Obsługuje ponowne przetwarzanie danych
PRIVATE
.
W przypadku urządzeń, które nie spełniają wymagań minimalnych, Aparat X wybiera CAPTURE_MODE_MINIMIZE_LATENCY
.
Opóźnienie migawki jest dostępne tylko w przypadku Zrzutów zdjęć.
Nie można jej włączyć w ramach funkcji Przechwytywanie wideo
lub z rozszerzeniami Aparatu.
Ponieważ używanie lampy błyskowej skutkuje większym opóźnieniem,
Opóźnienie migawki nie działa, gdy lampa błyskowa jest włączona lub jest w trybie AUTO.
Więcej informacji o ustawianiu trybu lampy błyskowej znajdziesz na stronie setFlashMode()
.
Włącz opóźnienie migawki bez migawki
Aby włączyć opóźnienie migawki przy zerowej migawce, przekaż CAPTURE_MODE_ZERO_SHOT_LAG
do ImageCapture.Builder.setCaptureMode()
. W przypadku niepowodzenia wartość setCaptureMode()
przyjmuje wartość CAPTURE_MODE_MINIMIZE_LATENCY
.
setFlashMode()
Domyślny tryb lampy błyskowej to FLASH_MODE_OFF
. Aby ustawić tryb lampy błyskowej, użyj ImageCapture.Builder.setFlashMode()
:
FLASH_MODE_ON
: lampa błyskowa jest zawsze włączona.FLASH_MODE_AUTO
: lampa błyskowa włącza się automatycznie w przypadku zdjęć robionych przy słabym oświetleniu.
Zrób zdjęcie
Poniższy przykładowy kod pokazuje, jak skonfigurować aplikację do robienia zdjęć:
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);
Pamiętaj, że bindToLifecycle()
zwraca obiekt Camera
. Więcej informacji o sterowaniu sygnałem wyjściowym aparatu, np. powiększeniem i ekspozycją, znajdziesz w tym przewodniku.
Po skonfigurowaniu aparatu ten kod zrobi zdjęcie na podstawie działanie użytkownika:
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. } } ); }
Metoda przechwytywania obrazu w pełni obsługuje
JPEG
. Przykładowy kod
który pokazuje, jak przekonwertować plik Media.Image
obiekt z formatu YUV_420_888
na RGB
Bitmap
, patrz
YuvToRgbConverter.kt
.
Dodatkowe materiały
Więcej informacji o aparacie AparatX znajdziesz w tych dodatkowych materiałach.
Ćwiczenia z programowania
Przykładowy kod