Robienie zdjęć

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:

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

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:

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

  • Pierwsze kroki z Aparatem X
  • Przykładowy kod

  • Przykładowe aplikacje CameraX