Главная » C#, Windows Runtime, XAML, Разработка для Windows 8 » Захват изображения и видео Windows Runtime

0

В работе с видео, аудио и изображениями существует масса задач со  своими требованиями. Например, если Вы хотите выполнить захват изображения, чтобы установить свою фотографию на рабочий стол,  Вам достаточно стандартного диалогового окна, позволяющего  выполнить  захват, не вдаваясь в  детали. Но если Вы хотите сканировать штрих-коды в режиме реального времени, очевидно, стандартное окно не подойдет, и нужно получать прямой доступ к потоку данных с камеры. Поэтому мы сейчас рассмотрим как стандартное диалоговое окно, так и возможность взаимодействия напрямую с камерой.

Использование CameraCaptureUI

Начнем обзор с класса CameraCaptureUI, который позволяет  инициировать вызов стандартного диалога для выполнения захвата  изображения или видео. Продемонстрируем небольшой пример. Создадим простой интерфейс, который будет  содержать  кнопку,   позволяющую вызвать диалог,  а  также  элемент управления Image, куда мы будем выводить полученное изображение:

<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">

<StackPanel Orientation="Vertical">

<Button Content="Take a Picture" Click="Button_Click_1" />

<Image Name="photo" Height="400" Width="400"></Image>

</StackPanel>

</Grid>

А теперь опишем обработчик события, возникающего при нажатии на кнопку,

а также логику работы приложения:

private async void TakeAPicture()

{

CameraCaptureUI camera=new CameraCaptureUI(); camera.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png; camera.PhotoSettings.MaxResolution =

CameraCaptureUIMaxPhotoResolution.HighestAvailable; StorageFile file = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);

BitmapImage btn = new BitmapImage();

btn.SetSource(await file.OpenAsync(FileAccessMode.Read));

photo.Source = btn;

}

private void Button_Click_1(object sender, RoutedEventArgs e)

{

TakeAPicture();

}

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

«обрезать» изображение до желаемых размеров и др. Причем настройки могут заполняться как для изображений, так и для видео.

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

Если  Вы  запустите  приложение,  то,  скорее  всего, увидите   изображение,

аналогичное этому:

Рис. 9.5.

Все дело в  том, что приложение должно заявить в  своих возможностях права доступа к камере и (или) микрофону. Для этого следует отметить соответствующие возможности  в     редакторе   манифеста.   Если   диалог   настроен   правильно и возможности определены, то Вы увидите что-то аналогичное на своем экране (без меня):

Рис. 9.6.

Как видите, тут есть возможность  вернуться в  приложение (кстати, мы  это не обрабатываем),  изменить настройки камеры и выполнить  захват  с помощью простого щелчка или прикосновения.

Но вернемся в код. После успешного запуска и захвата изображения диалоговое окно возвращает объект типа StorageFile, который представляет собой ссылку на файл во временном   хранилище нашего  приложения (об этом пойдет речь в следующей главе). Используя этот файл, мы формируем изображение в памяти с  помощью  объекта  типа  BitmapImage  и  передаем  его  в   элемент  Image, установив свойство Source.

Если  все   прошло  хорошо,  и  изображение  было  захвачено, то  на   экране отобразится фотография из временного файла:

Рис. 9.7.

Использование Media Capture API

Другим  способом  получить  изображение  с  камеры  и  микрофона  является использование Media Capture API. Тут достаточно много классов, но основным является класс  MediaCapture.  Его  задача  —  использовать установленные настройки и с их помощью получить доступ к потокам видео и (или) аудио и записать данные внутрь файла или потока. Разработчик может как преобразовать данные в процессе, так и обрабатывать изображения с определенной периодичностью.

Ниже показан небольшой кусок кода, который подготавливает MediaCapture для работы:

DeviceInformationCollection devices=

await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture); MediaCapture media=new MediaCapture();

MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();

settings.RealTimeModeEnabled = true; settings.StreamingCaptureMode = StreamingCaptureMode.Video; settings.PhotoCaptureSource = PhotoCaptureSource.Auto; settings.VideoDeviceId=devices[0].Id;

await media.InitializeAsync(settings); MediaEncodingProfile profile =

MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

На  первом этапе  мы  сформировали список  всех устройств,   которые   нам понадобятся, чтобы выбрать идентификатор желаемого устройства и установить в  настройках MediaCapture. На втором  этапе  был сформирован объект типа MediaCaptureInitializationSettings,    который   содержит   настройки   потока. Настройки устанавливаются  с  помощью специального метода InitializeAsync. Наконец,  был  создан  профиль, определяющий качество видео, которое  мы хотим размещать в поток или файл.

Последнее, что остается сделать, — вызвать метод  StartRecordToStreamAsync

или StartRecordToStorageFileAsync:

media.StartRecordToStorageFileAsync(profile, file);

Естественно, если Вы хотите сразу же отображать данные с камеры,  то  лучше воспользоваться потоком.

Сергей Лутай, Сергей Байдачный, Windows 8 для C# разработчиков

По теме:

  • Комментарии