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

На этой странице описано, как снимать высококачественные изображения с помощью 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)

Ява

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

Ява

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 см. в руководстве по настройке оптимизации, флэш-памяти и формата файлов .

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

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

Кодлаб

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

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