Ручные элементы управления фото- и видеозахватом на камере
В этой статье рассказывается, как использовать ручные элементы управления устройства для включения расширенных сценариев фото- и видеозахвата, в том числе оптической стабилизации изображений и плавного масштабирования.
Описанные в ней элементы управления добавляются в приложение с помощью одного и того же шаблона. Для начала проверьте, поддерживается ли элемент управления на устройстве, на котором выполняется приложение. Если это так, установите для элемента управления нужный режим. Как правило, если элемент управления не поддерживается на текущем устройстве, необходимо отключить или скрыть элемент пользовательского интерфейса, который позволяет пользователю включать соответствующую функцию.
В этой статье используется код, адаптированный из примера Camera Manual Controls SDK. Вы можете скачать этот пример, чтобы просмотреть код в контексте или использовать пример как отправную точку для настройки собственного приложения.
В этой статье используются понятия и код из статьи Основные принципы фото-, аудио- и видеозахвата с помощью MediaCapture, в которой описаны этапы реализации основных принципов фото- и видеозахвата. Мы рекомендуем ознакомиться с базовым шаблоном захвата мультимедиа в этой статье, прежде чем перейти к более сложным сценариям захвата. Код в этой статье подразумевает, что ваше приложение уже содержит экземпляр MediaCapture, инициализированный надлежащим образом.
Все API элементов управления устройства, описанные в этой статье, входят в пространство имен Windows.Media.Devices.
Экспозиция
ExposureControl позволяет задать скорость затвора для фото- или видеосъемки.
В этом примере используется элемент управления Slider для настройки текущего значения экспозиции и флажок для включения и выключения автоматической настройки экспозиции.
Проверьте, поддерживает ли используемое устройство захвата ExposureControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции. Задайте для флажка состояние "Установлен", чтобы указать, включена ли в данный момент автоматическая настройка экспозиции (свойство Auto).
Величина экспозиции должна находиться в поддерживаемом диапазоне устройства и изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком.
Задайте в качестве значения элемента управления ползунком текущее значение ExposureControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий ValueChanged получите текущее значение элемента управления и установите значение экспозиции путем вызова метода SetValueAsync.
В обработчике событий CheckedChanged флажка автоматической экспозиции включите или выключите автоматическую настройку экспозиции путем вызова метода SetAutoAsync и передачи значения логического типа.
Режим автоматической выдержки поддерживается, только пока выполняется поток предварительного просмотра. Убедитесь, что поток предварительного просмотра выполняется, перед тем как включить автоматическую экспозицию.
Коррекция экспозиции
ExposureCompensationControl позволяет задавать коррекцию экспозиции для фото- или видеосъемки.
В этом примере используется элемент управления Slider для настройки текущего значения коррекции экспозиции.
Проверьте, поддерживает ли используемое устройство захвата ExposureCompensationControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции.
Величина коррекции экспозиции должна находиться в поддерживаемом диапазоне устройства и должна изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком.
Задайте в качестве значения элемента управления ползунком текущее значение ExposureCompensationControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий ValueChanged получите текущее значение элемента управления и установите значение экспозиции путем вызова метода SetValueAsync.
Мигание
FlashControl позволяет включить или отключить вспышку, а также включить автоматическую вспышку, когда система динамически определяет, следует ли ее использовать. Этот элемент управления позволяет включить автоматическое устранение эффекта красных глаз на устройствах, которые поддерживают эту возможность. Эти параметры будут применяться к фотографиям. TorchControl — это отдельный элемент управления для включения и выключения фонарика для видеозаписи.
В этом примере используется набор переключателей для переключения между режимами вспышки «Включено», «Выключено» и «Авто». Также имеется флажок для включения функции устранения эффекта красных глаз и видеофонарика.
Проверьте, поддерживает ли используемое устройство записи FlashControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции. Если FlashControl поддерживается, автоматическое устранение эффекта красных глаз может поддерживаться или не поддерживаться, поэтому перед включением пользовательского интерфейса следует проверить свойство RedEyeReductionSupported. Так как TorchControl и flash — два отдельных элемента управления, также следует проверить его свойство Supported перед использованием.
В обработчике событий Checked для каждого переключателя flash следует включить или отключить соответствующий параметр вспышки. Обратите внимание: чтобы вспышка использовалась всегда, необходимо установить для свойства Enabled значение true, а для свойства Auto — значение false.
В обработчике для флажка устранения эффекта красных глаз установите свойству RedEyeReduction соответствующее значение.
Наконец, в обработчике для флажка видеофонарика установите для свойства Enabled соответствующее значение.
На некоторых устройствах фонарик не будет светить, даже если для TorchControl.Enabled установлено значение true, если на устройстве не запущен поток предварительного просмотра и в данный момент не выполняется запись видео. Рекомендуемый порядок действий: включить предварительный просмотр видео, затем включить фонарик, установив для Enabled значение true, а затем начать видеозапись. На некоторых устройствах фонарик включается после запуска предварительного просмотра. На других устройствах фонарик может не включаться, пока не начнется видеозапись.
Фокус
Для объекта FocusControl поддерживаются три распространенных метода настройки фокусировки камеры: непрерывная автофокусировка, фокусировка по нажатию и фокусировка вручную. Приложение камеры поддерживает все три этих метода, но для удобства чтения в этой статье каждый метод обсуждается по отдельности. В этом разделе также рассматривается включение вспомогательного света для фокусировки.
Непрерывная автофокусировкаПри включенной непрерывной автофокусировке камера фокусируется динамически, пытаясь сохранить объект съемки в фокусе. В этом примере используется переключатель для включения и выключения непрерывной автофокусировки.
Проверьте, поддерживает ли используемое устройство записи FocusControl, проверив свойство Supported. Затем проверьте, поддерживается ли непрерывная автофокусировка, проверив список SupportedFocusModes на наличие значения FocusMode.Continuous. Если оно присутствует, можно отобразить переключатель непрерывной автофокусировки.
В обработчике событий Checked для переключателя непрерывной автофокусировки используйте свойство VideoDeviceController.FocusControl для получения экземпляра элемента управления. Вызовите UnlockAsync, чтобы разблокировать элемент управления, если приложение ранее вызвало LockAsync для включения другого режима фокусировки.
Создайте новый объект FocusSettings и установите для свойства Mode значение Continuous. Установите для свойства AutoFocusRange значение, подходящее для вашего сценария приложения или выбранное пользователем из пользовательского интерфейса. Передайте объект FocusSettings в метод Configure, а затем вызовите FocusAsync для запуска непрерывной автофокусировки.
Режим автофокусировки поддерживается только во время выполнения потока предварительного просмотра. Убедитесь, что поток предварительного просмотра выполняется, перед тем как включить непрерывную автофокусировку.
Фокусировка по нажатиюМетод фокусировки по нажатию использует FocusControl и RegionsOfInterestControl для определения подобласти кадра, на которой должно сфокусироваться устройство записи. Область фокуса задается пользователем путем нажатия на экран, после чего отображается поток предварительного просмотра.
В этом примере используется переключатель для включения и выключения режима фокусировки по нажатию.
Проверьте, поддерживает ли используемое устройство записи FocusControl, проверив свойство Supported. Чтобы воспользоваться этим методом, необходима поддержка RegionsOfInterestControl и хотя бы одной области. Проверьте свойства AutoFocusSupported и MaxRegions, чтобы определить, следует ли показывать переключатель для фокусировки по нажатию.
В обработчике событий Checked для переключателя фокусировки по нажатию используйте свойство VideoDeviceController.FocusControl для получения экземпляра элемента управления. Вызовите метод LockAsync, чтобы заблокировать элемент управления, если приложение ранее вызвало UnlockAsync для включения непрерывной автофокусировки, а затем дождитесь, пока пользователя коснется экрана, чтобы изменить фокус.
В этом примере происходит фокусировка на области, когда пользователь касается экрана, а затем фокус с этой области убирается, когда пользователь касается ее еще раз (как в случае переключателя). Используйте логическую переменную для отслеживания текущего состояния переключения.
Следующий шаг — ожидание передачи данных для события, когда пользователь касается экрана, путем обработки события Tapped для CaptureElement, для которого в данный момент отображается поток предварительного просмотра. Если камера в настоящее время не отображает поток предварительного просмотра или если режим фокусировки по нажатию отключен, выполните возврат из обработчика, не выполняя никаких действий.
Если переменная отслеживания _isFocused переключается в значение false, и если камера не находится в процессе фокуса (определяется свойством фокусстатефокусконтрол), начните процесс TAP в фокусировку. Получите положение касания пользователя из аргументов события, переданных в обработчик. В данном примере эта возможность также используется для получения размера области, на которой будет выполняться фокусировка. В этом случае размер составляет 1/4 от наименьшего размера элемента захвата. Передайте положение касания и размер области во вспомогательный метод TapToFocus, который определяется в следующем разделе.
Если для переключателя _isFocused задано значение true, пользователь должен удалить фокус из предыдущего региона. Это действие выполняется во вспомогательном методе TapUnfocus, показанном ниже.
В вспомогательном методе таптофокус установите переключатель _isFocused в значение true, чтобы следующий экран отправит фокус из области касания.
Следующая задача в этом вспомогательном методе — определить прямоугольник в потоке предварительного просмотра, которому будет назначаться элемент управления фокусом. Для этого требуется два действия. Сначала нужно определить прямоугольник, в котором разместится поток предварительного просмотра, в элементе управления CaptureElement. Он зависит от размеров потока предварительного просмотра и ориентации устройства. Вспомогательный метод GetPreviewStreamRectInControl, показанный в конце данного раздела, выполняет эту задачу и возвращает прямоугольник, содержащий поток предварительного просмотра.
Следующая задача в TapToFocus — преобразовать место касания и нужный размер прямоугольника фокусировки, который был определен в обработчике событий CaptureElement.Tapped, в координаты в потоке захвата. Вспомогательный метод ConvertUiTapToPreviewRect, показанный ниже в этом разделе, выполняет это преобразование и возвращает прямоугольник в координатах потока захвата, в котором будет находиться фокус.
Теперь, когда получен целевой прямоугольник, создайте новый объект RegionOfInterest, задав для свойства Bounds целевой прямоугольник, полученный в предыдущих шагах.
Получите FocusControl устройства захвата. Создайте новый объект FocusSettings и установите для Mode и AutoFocusRange желаемые значения, предварительно проверив, поддерживаются ли они в FocusControl. Вызовите Configure в FocusControl, чтобы активировать параметры и сообщить устройству, что следует начать фокусировку на выбранной области.
Затем получите RegionsOfInterestControl устройства записи и вызовите SetRegionsAsync, чтобы установить активную область. Несколько областей можно установить на устройствах, которые поддерживают такую возможность, но в этом примере задается только одна область.
Наконец, вызовите FocusAsync в FocusControl для фокусировки.
При реализации сценария «коснитесь, чтобы навести фокус» важен порядок операций. Вам следует вызывать эти API в следующем порядке:
Во вспомогательном методе TapUnfocus получите RegionsOfInterestControl и вызовите ClearRegionsAsync, чтобы очистить область, зарегистрированную с помощью элемента управления во вспомогательном методе TapToFocus. Затем получите FocusControl и вызовите FocusAsync, чтобы заставить устройство перефокусироваться без области интереса.
Вспомогательный метод GetPreviewStreamRectInControl использует разрешение потока предварительного просмотра и ориентацию устройства для определения прямоугольника внутри элемента управления предварительного просмотра, содержащего поток предварительного просмотра; при этом обрезаются все поля для киноформата "Letterbox", которые может добавлять этот элемент управления для сохранения соотношения сторон потока. Этот метод также использует переменные — члены класса, определенные в примере базового кода захвата мультимедиа в разделе Основные принципы фото-, аудио- и видеозахвата с помощью MediaCapture.
Вспомогательный метод ConvertUiTapToPreviewRect принимает в качестве аргументов место события касания, требуемый размер области фокуса и прямоугольник, содержащий поток предварительного просмотра, полученный из вспомогательного метода GetPreviewStreamRectInControl. Этот метод использует данные значения и текущую ориентацию устройства для расчета прямоугольника потока предварительного просмотра, содержащего нужную область. Этот метод также использует переменные — члены класса, определенные в примере базового кода захвата мультимедиа в разделе Захват фотографий и видео с помощью MediaCapture.
Фокусировка вручнуюПри ручной фокусировке используется элемент управления Slider, который позволяет задать текущую глубину фокуса для устройства захвата. Для включения и выключения ручной фокусировки используется переключатель.
Проверьте, поддерживает ли используемое устройство записи FocusControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции.
Величина фокуса должна находиться в поддерживаемом диапазоне устройства и должна изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком.
Задайте в качестве значения элемента управления ползунком текущее значение FocusControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий Checked для переключателя фокусировки вручную получите объект FocusControl и вызовите LockAsync, если приложение ранее разблокировало фокус путем вызова UnlockAsync.
В обработчике событий ValueChanged для ползунка фокусировки вручную получите текущее значение элемента управления и установите значение фокуса, вызвав SetValueAsync.
Включение подсветки для фокусировкиНа устройствах, поддерживающих эту функцию, вы можете включить подсветку для фокусировки, которая помогает устройству сфокусироваться. В этом примере используется флажок для включения и отключения подсветки для фокусировки.
Проверьте, поддерживает ли используемое устройство записи FlashControl, проверив свойство Supported. Также проверьте AssistantLightSupported, чтобы узнать, поддерживается ли подсветка для фокусировки. Если обе возможности поддерживаются, вы можете включить и отобразить пользовательский интерфейс для этой функции.
В обработчике событий CheckedChanged получите объект FlashControl устройства захвата. Задайте свойство AssistantLightEnabled, чтобы включить или отключить подсветку.
Скорость ISO
IsoSpeedControl позволяет задать скорость ISO для фото- или видеосъемки.
В этом примере используется элемент управления Slider для настройки текущего значения коррекции экспозиции и флажок для включения и выключения автоматической настройки скорости ISO.
Проверьте, поддерживает ли используемое устройство записи IsoSpeedControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции. Задайте для флажка состояние "Установлен", чтобы указать, включена ли в данный момент автоматическая настройка скорости ISO (свойство Auto).
Величина скорости ISO должна находиться в поддерживаемом диапазоне устройства и должна изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком.
Задайте в качестве значения элемента управления ползунком текущее значение IsoSpeedControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий ValueChanged получите текущее значение элемента управления и установите значение скорости ISO путем вызова метода SetValueAsync.
В обработчике событий CheckedChanged флажка автоматической настройки скорости ISO включите параметр автоматической настройки скорости ISO, вызвав SetAutoAsync. Включите автоматическую настройку скорости ISO, вызвав SetValueAsync и передав текущее значение ползунка.
Оптическая стабилизация изображений
Оптическая стабилизация изображений (OIS) стабилизирует захваченный видеопоток с помощью механического управления аппаратным устройством захвата, что обеспечивает более высокое качество по сравнению с цифровой стабилизацией. На устройствах, которые не поддерживают оптическую стабилизацию изображений, можно использовать функцию VideoStabilizationEffect для выполнения цифровой стабилизации захваченного видео. Дополнительные сведения см. в статье Эффекты для видеозахвата.
Чтобы узнать, поддерживается ли на устройстве оптическая стабилизация изображений, проверьте свойство OpticalImageStabilizationControl.Supported.
Элемент управления OIS работает в трех режимах: "Включен", "Отключен" и "Автоматический режим". Устройство в динамическом режиме определяет, улучшит ли оптическая стабилизация захват мультимедиа, и, если это так, включает эту функцию. Если определенный режим содержится в коллекции OpticalImageStabilizationControl.SupportedModes, то он поддерживается на устройстве.
Чтобы включить или отключить оптическую стабилизацию изображений, переведите OpticalImageStabilizationControl.Mode в нужный режим.
Частота линии питания
Некоторые камеры поддерживают обработку для защиты от мерцания, которая зависит от частоты переменного тока в текущей среде. Некоторые устройства поддерживают автоматическое определение частоты питания, а на других ее необходимо задать вручную. В следующем примере кода показано, как определить частоты питания устройстве и, если требуется, задать частоту вручную.
Сначала вызовите метод TryGetPowerlineFrequency класса VideoDeviceController, передав выходной параметр типа PowerlineFrequency. Если вызов завершается ошибкой, управление частотой питания на текущем устройстве не поддерживается. Если функция поддерживается, вы можете определить, доступен ли на устройстве автоматический режим, попытавшись установить автоматический режим. Для этого вызовите трисетповерлинефрекуенци и передавайте значение Auto. Если вызов будет выполнен, это означает, что частота автоматической Powerline поддерживается. Если контроллер частоты питания поддерживается на устройстве, а автоматическое обнаружение частоты — нет, вы можете вручную задать частоту с помощью метода TrySetPowerlineFrequency. В этом примере MyCustomFrequencyLookup — это пользовательский метод, который реализуется, чтобы определить правильную частоту для текущего расположения устройства.
Баланс белого
WhiteBalanceControl позволяет задать баланс белого для фото- или видеосъемки.
В этом примере используется элемент управления ComboBox для выбора встроенных стандартных значений цветовой температуры и элемент управления Slider для ручной настройки баланса белого.
Проверьте, поддерживает ли используемое устройство записи WhiteBalanceControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции. Установите для элементов поля со списком значения перечисления ColorTemperaturePreset. Для выбранного элемента установите текущее значение свойства Preset.
Для ручного элемента управления значение баланса белого должно находиться в поддерживаемом диапазоне устройства и изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком. Перед включением ручного элемента управления убедитесь, что диапазон между минимальным и максимальным значениями больше, чем размер шага. В противном случае этот элемент управления не будет поддерживаться на текущем устройстве.
Задайте в качестве значения элемента управления ползунком текущее значение WhiteBalanceControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий SelectionChanged поля со списком для цветовой температуры получите выбранное в данный момент стандартное значение и задайте значение для элемента управления путем вызова SetPresetAsync. Если выбрано значение, отличное от Manual, отключите ползунок ручной настройки баланса белого.
В обработчике событий ValueChanged получите текущее значение элемента управления и установите значение баланса белого путем вызова метода SetValueAsync.
Регулировка баланса белого поддерживается только во время выполнения потока предварительного просмотра. Убедитесь, что поток предварительного просмотра выполняется, перед тем как настраивать баланс белого.
Стандартное значение ColorTemperaturePreset.Auto сообщает системе, что необходимо автоматически настроить баланс белого. В некоторых случаях, например при записи последовательности фотографий, где уровни баланса белого должны совпадать для всех кадров, вы можете заблокировать элемент управления, зафиксировав текущее значение автоматической настройки. Для этого вызовите SetPresetAsync и укажите стандартное значение Manual, не задавая значение для элемента управления с помощью SetValueAsync. Это приведет к блокировке текущего значения устройством. Не пытайтесь прочитать текущее значение элемента управления, а затем передать возвращенное значение в SetValueAsync, так как оно может оказаться неправильным.
Масштабирование
ZoomControl позволяет задать масштаб для фото- или видеосъемки.
В этом примере используется элемент управления Slider для настройки текущего значения масштаба. В следующем разделе показано, как выполняется масштабирование на основе жестов сжатия на экране.
Проверьте, поддерживает ли используемое устройство записи ZoomControl, проверив свойство Supported. Если этот элемент управления поддерживается, вы можете включить и отобразить пользовательский интерфейс для этой функции.
Значение масштаба должно находиться в поддерживаемом диапазоне устройства и должно изменяться шагами поддерживаемой величины. Получите поддерживаемые значения для текущего устройства путем проверки свойств Min, Max и Step, которые используются для установки соответствующих свойств элемента управления ползунком.
Задайте в качестве значения элемента управления ползунком текущее значение ZoomControl после отмены регистрации обработчика событий ValueChanged, чтобы событие не активировалось при установке значения.
В обработчике событий ValueChanged создайте новый экземпляр класса ZoomSettings, задав для свойства Value текущее значение ползунка масштабирования. Если свойство SupportedModes элемента управления ZoomControl содержит ZoomTransitionMode.Smooth, это означает, что устройство поддерживает плавные переходы между уровнями масштабирования. Поскольку этот режим улучшает взаимодействие с пользователем, это значение обычно используется для свойства Mode объекта ZoomSettings.
Наконец, измените текущие параметры масштабирования, передав объект ZoomSettings в метод Configure объекта ZoomControl.
Плавное масштабирование жестом сжатияКак отмечалось в предыдущем разделе, на устройствах, поддерживающих соответствующую функцию, с помощью режима плавного масштабирования устройство захвата может плавно переходить от одного уровня цифрового масштабирования к другому. Это позволяет пользователю избежать резких переходов при динамическом изменении масштаба в процессе записи. В этом разделе описывается, как изменить масштаб в ответ на жест сжатия.