Вариант использования для захвата изображений предназначен для съемки высококачественных фотографий с высоким разрешением и обеспечивает функции автоматического баланса белого, автоматической экспозиции и автофокусировки (3A), а также простое ручное управление камерой. Вызывающий абонент несет ответственность за решение о том, как использовать захваченное изображение, включая следующие варианты:
-
takePicture(Executor, OnImageCapturedCallback)
: этот метод обеспечивает буфер захваченного изображения в памяти. -
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: этот метод сохраняет захваченное изображение в указанном месте файла.
Существует два типа настраиваемых исполнителей, на которых запускается ImageCapture
: исполнитель обратного вызова и исполнитель ввода-вывода.
- Исполнитель обратного вызова является параметром методов
takePicture
. Он используется для выполнения предоставленного пользователем методаOnImageCapturedCallback()
. - Если вызывающая сторона решает сохранить изображение в файле, вы можете указать исполнителя для выполнения ввода-вывода. Чтобы установить исполнителя ввода-вывода, вызовите
ImageCapture.Builder.setIoExecutor(Executor)
. Если исполнитель отсутствует, CameraX по умолчанию использует внутренний исполнитель ввода-вывода для задачи.
Настроить захват изображения
Захват изображения обеспечивает базовые элементы управления для фотосъемки, такие как вспышка, непрерывная автофокусировка, задержка при нулевой задержке и многое другое.
установитьCaptureMode()
Используйте ImageCapture.Builder.setCaptureMode()
чтобы настроить режим захвата при съемке фотографии:
-
CAPTURE_MODE_MINIMIZE_LATENCY
: оптимизировать захват изображения с учетом задержки. -
CAPTURE_MODE_MAXIMIZE_QUALITY
: оптимизация захвата изображения для повышения его качества.
По умолчанию используется режим захвата CAPTURE_MODE_MINIMIZE_LATENCY
. Дополнительную информацию см. в справочной документации по setCaptureMode()
.
Задержка при нулевой задержке
Начиная с версии 1.2, в качестве режима захвата доступен режим нулевой задержки затвора ( CAPTURE_MODE_ZERO_SHOT_LAG
). При включенной нулевой задержке затвора задержка значительно снижается по сравнению с режимом захвата по умолчанию CAPTURE_MODE_MINIMIZE_LATENCY
, так что вы никогда не пропустите кадр.
Функция Zero-Shutter Lag использует кольцевой буфер, в котором хранятся три последних кадра захвата. Когда пользователь нажимает кнопку захвата, CameraX вызывает takePicture()
, а кольцевой буфер извлекает захваченный кадр с отметкой времени, наиболее близкой к отметке времени нажатия кнопки. Затем CameraX повторно обрабатывает сеанс захвата, чтобы создать изображение из этого кадра, которое сохраняется на диск в формате JPEG.
Предварительные условия
Прежде чем включать задержку с нулевым затвором, используйте isZslSupported()
чтобы определить, соответствует ли ваше устройство следующим требованиям:
- Ориентирован на Android 6.0+ (уровень API 23 и выше).
- Поддерживает
PRIVATE
повторную обработку .
Для устройств, которые не соответствуют минимальным требованиям, 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, обратитесь к следующим дополнительным ресурсам.