Захват изображения

На этой странице описано, как получать высококачественные изображения с помощью CameraX. Для этого используется класс ImageCapture и связанные с ним методы.

Ключевые понятия

В данном документе рассматриваются следующие основные понятия:

  • Способ хранения : Вы можете сохранять изображения либо в буфер в оперативной памяти, либо непосредственно в файл.
  • Исполнительные модули : ImageCapture использует исполнительные модули для обработки обратных вызовов и операций ввода-вывода. Вы можете настроить эти исполнительные модули для повышения производительности и контроля.
  • Режимы захвата : Вы можете настроить режим захвата для оптимизации либо задержки, либо качества изображения.

Способ хранения

Существует два способа захвата изображений с помощью ImageCapture . Оба используют перегрузку метода ImageCapture.takePicture() :

  • Файл: Используйте takePicture(OutputFileOptions, Executor, OnImageSavedCallback) , чтобы сохранить захваченное изображение непосредственно в файл на диске.

    • Это самый распространённый способ делать фотографии.
  • В памяти: Используйте takePicture(Executor, OnImageCapturedCallback) , чтобы получить буфер захваченного изображения в памяти.

    • Это полезно для обработки или анализа изображений в реальном времени.

Исполнители завещаний

При вызове takePicture вы передаете объект Executor и либо функцию OnImageCapturedCallback , либо OnImageSavedCallback . Executor выполняет функцию обратного вызова и обрабатывает все последующие операции ввода-вывода.

Сфотографируйте

Чтобы сделать снимок, нужно настроить камеру, а затем вызвать takePicture .

Настройте камеру

Для настройки камеры создайте CameraProvider . Затем создайте объект ImageCapture . Используйте ImageCapture.Builder() :

Котлин

val imageCapture = ImageCapture.Builder()
    .setTargetRotation(view.display.rotation)
    .build()

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)

Java

ImageCapture imageCapture =
    new ImageCapture.Builder()
        .setTargetRotation(view.getDisplay().getRotation())
        .build();

cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview);

Сфотографируйте

После настройки камеры вызовите takePicture() для захвата изображения. В этом примере показано, как использовать takePicture() для сохранения изображения на диск:

Котлин

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.
            }
       }
    );
}

Вот основные моменты, касающиеся этого фрагмента:

  • Параметр ImageCapture.OutputFileOptions позволяет настроить место сохранения и метаданные.
    • Здесь метод OutputFileOptions.Builder() использует объект File для определения места сохранения.
  • Функция takePicture() асинхронно захватывает изображение, используя предоставленные параметры и исполнитель.
  • Функция OnImageSavedCallback предоставляет обработчики событий при успешном и неудачном выполнении операции.
    • Функция обратного вызова onImageSaved() обрабатывает успешный захват изображения и предоставляет доступ к сохраненным результатам .
    • Функция обратного вызова onError() обрабатывает ошибки захвата изображения.

Дополнительные опции

Дополнительные способы настройки ImageCapture описаны в руководстве по настройке оптимизации, Flash и форматов файлов .

Дополнительные ресурсы

Чтобы узнать больше о CameraX, обратитесь к следующим ресурсам:

Кодлаб

  • Начало работы с CameraX
  • Пример кода

  • Примеры приложений CameraX