Robienie zdjęć

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:

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

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

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 wyjściem 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óra 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

  • Pierwsze kroki z AparatemX
  • Przykładowy kod

  • Przykładowe aplikacje CameraX