Захоплення зображення і відео Windows Runtime

У роботі з відео, аудіо та зображеннями існує маса завдань зі своїми вимогами Наприклад, якщо Ви хочете виконати захоплення зображення, щоб встановити свою фотографію на робочий стіл, Вам достатньо стандартного діалогового вікна, що дозволяє виконати захоплення, не вдаючись у деталі Але якщо Ви хочете сканувати штрих-коди в режимі реального часу, очевидно, стандартне вікно не підійде, і потрібно отримувати прямий доступ до потоку даних з камери Тому ми зараз розглянемо як стандартне діалогове вікно, так і можливість взаємодії безпосередньо з камерою

Почнемо огляд з класу CameraCaptureUI, Який дозволяє ініціювати виклик стандартного діалогу для виконання захоплення зображення або відео Продемонструємо невеликий приклад Створимо простий інтерфейс, який буде містити кнопку, що дозволяє викликати діалог, а також елемент управління Image, Куди ми будемо виводити отримане зображення:

&ltGrid Background=&quot{StaticResource ApplicationPageBackgroundBrush}&quot&gt

&ltStackPanel Orientation=&quotVertical&quot&gt

&ltButton Content=&quotTake a Picture&quot Click=&quotButton_Click_1&quot /&gt

&ltImage Name=&quotphoto&quot Height=&quot400&quot Width=&quot400&quot&gt&lt/Image&gt

&lt/StackPanel&gt

&lt/Grid&gt

А тепер опишемо обробник події, що виникає при натисканні на кнопку,

а також логіку роботи програми:

private async void TakeAPicture()

{

CameraCaptureUI camera=new CameraCaptureUI() cameraPhotoSettingsFormat = CameraCaptureUIPhotoFormatPng cameraPhotoSettingsMaxResolution =

CameraCaptureUIMaxPhotoResolutionHighestAvailable StorageFile file = await cameraCaptureFileAsync(CameraCaptureUIModePhoto)

BitmapImage btn = new BitmapImage()

btnSetSource(await fileOpenAsync(FileAccessModeRead))

photoSource = btn

}

private void Button_Click_1(object sender, RoutedEventArgs e)

{

TakeAPicture()

}

У коді вище ми створюємо екземпляр типу CameraCaptureUI і переходимо до його налаштуванні Тут можна задати такі параметри, як максимальний дозвіл зображення, формат даних, можливість перед виходом з діалогу

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

У наведених налаштуваннях немає нічого складного Переходимо до виклику методу CaptureFileAsync Цей метод приймає в якості параметрів формат медіа (відео, зображення, відео або зображення) і, базуючись на цьому форматі і попередніх настройках, ініціює діалогове вікно, що є складовою частиною операційної системи

Якщо Ви запустіть додаток, то, швидше за все, побачите зображення,

аналогічне цьому:

Рис 95

Вся справа в тому, що додаток повинен заявити у своїх можливостях права доступу до камери і (або) мікрофона Для цього слід зазначити відповідні можливості в редакторі маніфесту Якщо діалог налаштований правильно і можливості визначені, то Ви побачите щось аналогічне на своєму екрані (без мене):

Рис 96

Як бачите, тут є можливість повернутися в додаток (до речі, ми це не обробляємо), змінити настройки камери і виконати захоплення за допомогою простого клацання або дотику

Але повернемося в код Після успішного запуску і захоплення зображення діалогове вікно повертає обєкт типу StorageFile, Який являє собою посилання на файл у тимчасовому сховищі нашого застосування (про це піде мова в наступному розділі) Використовуючи цей файл, ми формуємо зображення в памяті за допомогою обєкта типуBitmapImage  і передаємо його в елементImage, Встановивши властивість Source

Якщо все пройшло добре, і зображення було захоплено, то на екрані відобразиться фотографія з тимчасового файлу:

Рис 97

Іншим способом отримати зображення з камери і мікрофону є використання Media Capture API Тут досить багато класів, але основним є класMediaCapture Його завдання – використати встановлені настройки і з їх допомогою отримати доступ до потоків відео та (або) аудіо та записати дані всередину файлу або потоку Розробник може як перетворити дані в процесі, так і обробляти зображення з певною періодичністю

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

DeviceInformationCollection devices=

await DeviceInformationFindAllAsync(DeviceClassVideoCapture) MediaCapture media=new MediaCapture()

MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings()

settingsRealTimeModeEnabled = true settingsStreamingCaptureMode = StreamingCaptureModeVideo settingsPhotoCaptureSource = PhotoCaptureSourceAuto settingsVideoDeviceId=devices[0]Id

await mediaInitializeAsync(settings) MediaEncodingProfile profile =

MediaEncodingProfileCreateMp4(VideoEncodingQualityHD720p)

На першому етапі ми сформували список всіх пристроїв, які нам знадобляться, щоб вибрати ідентифікатор бажаного пристрою і встановити в настройках MediaCapture На другому етапі було сформовано обєкт типу MediaCaptureInitializationSettings, Який містить налаштування потоку Налаштування встановлюються за допомогою спеціального методу InitializeAsync Нарешті, був створений профіль, що визначає якість відео, яке ми хочемо розміщувати в потік або файл

Останнє, що залишається зробити, – викликати методStartRecordToStreamAsync

або StartRecordToStorageFileAsync:

mediaStartRecordToStorageFileAsync(profile, file)

Природно, якщо Ви хочете відразу ж відображати дані з камери, то краще скористатися потоком

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*