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

Вариант использования для захвата изображений предназначен для съемки высококачественных фотографий с высоким разрешением и обеспечивает функции автоматического баланса белого, автоматической экспозиции и автофокусировки (3A), а также простое ручное управление камерой. Вызывающий абонент несет ответственность за решение о том, как использовать захваченное изображение, включая следующие варианты:

Существует два типа настраиваемых исполнителей, на которых запускается ImageCapture : исполнитель обратного вызова и исполнитель ввода-вывода.

  • Исполнитель обратного вызова является параметром методов takePicture . Он используется для выполнения предоставленного пользователем метода OnImageCapturedCallback() .
  • Если вызывающая сторона решает сохранить изображение в файле, вы можете указать исполнителя для выполнения ввода-вывода. Чтобы установить исполнителя ввода-вывода, вызовите ImageCapture.Builder.setIoExecutor(Executor) . Если исполнитель отсутствует, CameraX по умолчанию использует внутренний исполнитель ввода-вывода для задачи.

Настройка захвата изображений

Захват изображения обеспечивает базовые элементы управления для фотосъемки, такие как вспышка, непрерывная автофокусировка, задержка при нулевой задержке и многое другое.

установитьCaptureMode()

Используйте ImageCapture.Builder.setCaptureMode() чтобы настроить режим захвата при съемке фотографии:

Режим захвата по умолчанию — CAPTURE_MODE_MINIMIZE_LATENCY . Дополнительную информацию см. в справочной документации по setCaptureMode() .

Нулевая задержка затвора

Начиная с версии 1.2, в качестве режима захвата доступен режим нулевой задержки затвора ( CAPTURE_MODE_ZERO_SHOT_LAG ). При включении нулевой задержки затвора задержка значительно сокращается по сравнению с режимом захвата по умолчанию CAPTURE_MODE_MINIMIZE_LATENCY , так что вы никогда не пропустите кадр.

Функция Zero-Shutter Lag использует кольцевой буфер, в котором хранятся три последних кадра захвата. Когда пользователь нажимает кнопку захвата, CameraX вызывает takePicture() , а кольцевой буфер извлекает захваченный кадр с отметкой времени, наиболее близкой к отметке времени нажатия кнопки. Затем CameraX повторно обрабатывает сеанс захвата, чтобы создать изображение из этого кадра, которое сохраняется на диск в формате JPEG.

Предварительные условия

Прежде чем включать задержку с нулевым затвором, используйте isZslSupported() чтобы определить, соответствует ли ваше устройство следующим требованиям:

Для устройств, которые не соответствуют минимальным требованиям, CameraX возвращается к CAPTURE_MODE_MINIMIZE_LATENCY .

Нулевая задержка затвора доступна только для варианта использования захвата изображения . Вы не можете включить его для варианта использования «Захват видео» или с расширениями камеры . Наконец, поскольку использование вспышки приводит к большей задержке, задержка нулевой затвора не работает, когда вспышка включена или в режиме АВТО. Для получения дополнительной информации о настройке режима вспышки см. setFlashMode() .

Включить задержку при нулевой затворе

Чтобы включить задержку нулевой затвора, передайте CAPTURE_MODE_ZERO_SHOT_LAG в ImageCapture.Builder.setCaptureMode() . В случае неудачи setCaptureMode() возвращается к CAPTURE_MODE_MINIMIZE_LATENCY .

установитьFlashMode()

Режим вспышки по умолчанию — FLASH_MODE_OFF . Чтобы установить режим вспышки, используйте ImageCapture.Builder.setFlashMode() :

  • FLASH_MODE_ON : вспышка всегда включена.
  • FLASH_MODE_AUTO : вспышка включается автоматически при съемке при слабом освещении.

Сфотографироваться

В следующем примере кода показано, как настроить приложение для съемки фотографий:

Котлин

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

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

Ява

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

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

Обратите внимание, что bindToLifecycle() возвращает объект Camera . См. это руководство для получения дополнительной информации об управлении выходными данными камеры, такими как масштабирование и экспозиция.

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

Котлин

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

Метод захвата изображения полностью поддерживает формат JPEG . Пример кода, показывающий, как преобразовать объект Media.Image из формата YUV_420_888 в объект Bitmap RGB, см. в разделе YuvToRgbConverter.kt .

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

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

Кодлаб

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

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