Funkcja robienia zdjęć jest przeznaczona do robienia zdjęć o wysokiej rozdzielczości i oferuje autobalans bieli, automatyczną ekspozycję i autofokus (3A), a także proste ręczne sterowanie aparatem. Rozmówca musi zdecydować, jak użyć zrobionego zdjęcia, w tym:
takePicture(Executor, OnImageCapturedCallback)
: ta metoda powoduje buforowanie w pamięci przechwyconego obrazu.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: ta metoda zapisuje przechwycony obraz w podanej lokalizacji pliku.
Istnieją 2 typy wykonawców z możliwością dostosowania, na których działa ImageCapture
: wykonawcy wywołania zwrotnego i wykonawcy zamówienia reklamowego.
- Wykonawca wywołania zwrotnego jest parametrem metod
takePicture
. Służy do wykonywania udostępnionego przez użytkownikaOnImageCapturedCallback()
. - Jeśli element wywołujący zapisze obraz w lokalizacji pliku, możesz wskazać wykonawcę, który wykona to zamówienie. Aby ustawić wykonawcy zamówienia reklamowego, wywołaj metodę
ImageCapture.Builder.setIoExecutor(Executor)
. Jeśli wykonawcy nie ma wykonawcy, w tym zadaniu aplikacja CameraX będzie domyślnie korzystać z wewnętrznego wykonawcy wejścia we/wy.
Skonfiguruj przechwytywanie obrazu
Funkcja Robienie zdjęć zapewnia podstawowe funkcje do robienia zdjęć, np. lampę błyskową, ciągły autofokus, brak migawki i inne.
setCaptureMode()
Użyj ImageCapture.Builder.setCaptureMode()
, aby skonfigurować tryb robienia zdjęć podczas robienia zdjęcia:
CAPTURE_MODE_MINIMIZE_LATENCY
: optymalizuj robienie zdjęć pod kątem opóźnienia.CAPTURE_MODE_MAXIMIZE_QUALITY
: optymalizuj robienie zdjęć pod kątem ich jakości.
Domyślnym trybem przechwytywania jest CAPTURE_MODE_MINIMIZE_LATENCY
.
Więcej informacji znajdziesz w dokumentacji referencyjnej setCaptureMode()
.
Zero opóźnienia
Od wersji 1.2 tryb zdjęcia bez migawki (CAPTURE_MODE_ZERO_SHOT_LAG
) jest dostępny.
Po włączeniu funkcji zero opóźnienia opóźnienie jest znacznie krótsze w porównaniu z domyślnym trybem robienia zdjęć (CAPTURE_MODE_MINIMIZE_LATENCY
), dzięki czemu nie przegapisz żadnego ujęcia.
Funkcja Zero opóźnienia migawki korzysta z bufora pierścieniowego, w którym przechowywane są 3 ostatnie klatki zdjęcia. Gdy użytkownik naciśnie przycisk nagrywania, CameraX wywoła metodę takePicture()
, a bufor pierścieniowy pobierze przechwyconą klatkę z sygnaturą czasową najbliżej momentu kliknięcia przycisku. Następnie CameraX ponownie przetwarza sesję przechwytywania, aby wygenerować na podstawie tej klatki obraz, który zostanie zapisany na dysku w formacie JPEG.
Wymagania wstępne
Zanim włączysz funkcję Zero opóźnienia, skorzystaj z isZslSupported()
, aby sprawdzić, czy Twoje urządzenie spełnia te wymagania:
- Aplikacja jest kierowana na Androida 6.0 lub nowszego (poziom API 23 lub wyższy).
- Obsługuje ponowne przetwarzanie
PRIVATE
.
W przypadku urządzeń, które nie spełniają wymagań minimalnych, usługa CameraX wraca do CAPTURE_MODE_MINIMIZE_LATENCY
.
Zero opóźnienia migawki jest dostępne tylko na potrzeby zapisywania obrazu.
Nie można jej włączyć w przypadku nagrywania wideo ani rozszerzeń aparatu.
Ponieważ użycie lampy błyskowej skutkuje dłuższym opóźnieniem, brak opóźnienia migawki nie działa, gdy lampa błyskowa jest włączona lub w trybie AUTO.
Więcej informacji o ustawianiu trybu lampy błyskowej znajdziesz w artykule setFlashMode()
.
Włącz tryb zerowego opóźnienia
Aby włączyć funkcję Zero opóźnienia, przejdź do: CAPTURE_MODE_ZERO_SHOT_LAG
, do: ImageCapture.Builder.setCaptureMode()
. Jeśli się nie uda, setCaptureMode()
przełączy się na CAPTURE_MODE_MINIMIZE_LATENCY
.
setFlashMode()
Domyślnym trybem lampy błyskowej jest FLASH_MODE_OFF
. Aby ustawić tryb lampy błyskowej, użyj ikony ImageCapture.Builder.setFlashMode()
:
FLASH_MODE_ON
: lampa błyskowa jest zawsze włączona.FLASH_MODE_AUTO
: lampa błyskowa jest włączana automatycznie przy słabym oświetleniu.
Zrób zdjęcie
Ten 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
. W tym przewodniku znajdziesz więcej informacji o kontrolowaniu wyjścia kamery, np. powiększenia i ekspozycji.
Po skonfigurowaniu aparatu zdjęcie zostanie zrobione za pomocą tego kodu w zależności od działania 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 format JPEG
. Przykładowy kod, który pokazuje, jak przekonwertować obiekt Media.Image
z formatu YUV_420_888
na obiekt RGB Bitmap
, znajdziesz w sekcji YuvToRgbConverter.kt
.
Dodatkowe materiały
Więcej informacji o aplikacji CameraX znajdziesz w tych dodatkowych materiałach.
Ćwiczenia z programowania
Przykładowy kod