Фото- и видеосъемка с использованием встроенного пользовательского интерфейса камеры в Windows
В этой статье описывается, как использовать класс CameraCaptureUI для записи фотографий или видео с помощью пользовательского интерфейса камеры, встроенного в Windows. Эта функция легко используется. Это позволяет приложению получать захваченные пользователем фотографии или видео с несколькими строками кода.
Если вы хотите предоставить собственный пользовательский интерфейс камеры или если в вашем сценарии требуется более надежный, низкий уровень управления операцией захвата, то следует использовать класс MediaCapture и реализовать собственный интерфейс записи. Дополнительные сведения см. в разделе "Базовый" фото, видео и аудиозапись с помощью MediaCapture.
Примечание.
Вы не должны указывать возможности веб-камеры или микрофона в файле манифеста приложения, если приложение использует только CameraCaptureUI. Если это сделать, ваше приложение будет отображаться в параметрах конфиденциальности камеры устройства, но даже если пользователь запрещает доступ к камере в приложении, это не позволит камереCaptureUI записывать носитель.
Это связано с тем, что встроенное приложение камеры Windows является доверенным первым приложением, которое требует от пользователя инициировать фото, звук и видеозахват с помощью нажатия кнопки. Ваше приложение может завершить сертификацию комплекта сертификации приложений Windows при отправке в Microsoft Store, если вы указываете возможности веб-камеры или микрофона при использовании CameraCaptureUI в качестве единственного механизма захвата фотографий.
Если вы используете MediaCapture, необходимо указать возможности веб-камеры или микрофона в файле манифеста приложения, если вы используете MediaCapture для записи звука, фотографий или видео программным способом.
Захват фотографии с помощью CameraCaptureUI
Чтобы использовать пользовательский интерфейс записи камеры, включите пространство имен Windows.Media.Capture в проект. Чтобы выполнять операции с возвращенным файлом образа, включите Windows.Storage.
using Windows.Media.Capture;
using Windows.Storage;
#include <winrt/Windows.Media.Capture.h>
#include <winrt/Windows.Media.Playback.h>
#include <winrt/Windows.Storage.h>
using namespace winrt;
using namespace Windows::Media::Capture;
using namespace Windows::Storage;
Чтобы записать фотографию, создайте объект CameraCaptureUI . Используя свойство PhotoSettings объекта, можно указать свойства возвращаемой фотографии, например формат изображения фотографии. По умолчанию пользовательский интерфейс захвата камеры поддерживает обрезку фотографии перед возвратом. Это можно отключить с помощью свойства AllowCropping. В этом примере для croppedSizeInPixels запрашивается, чтобы возвращаемое изображение было 200 x 200 в пикселях.
Примечание.
Обрезка изображений в CameraCaptureUI не поддерживается для устройств в семействе мобильных устройств. Значение свойства AllowCropping игнорируется при запуске приложения на этих устройствах.
Вызов CaptureFileAsync и указание CameraCaptureUIMode.Photo , чтобы указать, что фотография должна быть записана. Метод возвращает экземпляр StorageFile , содержащий изображение, если запись выполнена успешно. Если пользователь отменяет запись, возвращенный объект имеет значение NULL.
CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Jpeg;
captureUI.PhotoSettings.CroppedSizeInPixels = new Size(200, 200);
StorageFile photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo);
if (photo == null)
{
// User cancelled photo capture
return;
}
CameraCaptureUI captureUI;
captureUI.PhotoSettings().Format(CameraCaptureUIPhotoFormat::Jpeg);
captureUI.PhotoSettings().CroppedSizeInPixels({ 200, 200 });
StorageFile photo = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Photo);
if (!photo)
{
// User cancelled photo capture
co_return;
}
StorageFile, содержащий записанную фотографию, получает динамическое имя и сохраняется в локальной папке приложения. Чтобы лучше упорядочить захваченные фотографии, можно переместить файл в другую папку.
StorageFolder destinationFolder =
await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfilePhotoFolder",
CreationCollisionOption.OpenIfExists);
await photo.CopyAsync(destinationFolder, "ProfilePhoto.jpg", NameCollisionOption.ReplaceExisting);
await photo.DeleteAsync();
StorageFolder destinationFolder =
co_await ApplicationData::Current().LocalFolder().CreateFolderAsync(L"ProfilePhotoFolder",
CreationCollisionOption::OpenIfExists);
co_await photo.CopyAsync(destinationFolder, L"ProfilePhoto.jpg", NameCollisionOption::ReplaceExisting);
co_await photo.DeleteAsync();
Чтобы использовать фотографию в приложении, может потребоваться создать объект SoftwareBitmap , который можно использовать с несколькими разными возможностями универсального приложения Для Windows.
Сначала включите пространство имен Windows.Graphics.Imaging в проект.
using Windows.Storage.Streams;
using Windows.Graphics.Imaging;
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Windows.Storage.Streams.h>
using namespace Windows::Graphics::Imaging;
using namespace Windows::Storage::Streams;
Вызовите OpenAsync , чтобы получить поток из файла изображения. Вызовите BitmapDecoder.CreateAsync , чтобы получить декодирования растрового изображения для потока. Затем вызовите GetSoftwareBitmap, чтобы получить представление изображения SoftwareBitmap.
IRandomAccessStream stream = await photo.OpenAsync(FileAccessMode.Read);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();
IRandomAccessStream stream = co_await photo.OpenAsync(FileAccessMode::Read);
BitmapDecoder decoder = co_await BitmapDecoder::CreateAsync(stream);
SoftwareBitmap softwareBitmap = co_await decoder.GetSoftwareBitmapAsync();
Чтобы отобразить изображение в пользовательском интерфейсе, объявите элемент управления "Изображение " на странице XAML.
<Image x:Name="imageControl" Width="200" Height="200"/>
<Image x:Name="imageControl" Width="200" Height="200"/>
Чтобы использовать растровое изображение программного обеспечения на странице XAML, включите в проект пространство имен Windows.UI.Xaml.Media.Imaging.
using Windows.UI.Xaml.Media.Imaging;
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
using namespace Windows::UI::Xaml::Media::Imaging;
Элемент управления "Изображение" требует, чтобы источник изображения был в формате BGRA8 с предварительно заданным альфа-форматом или нет альфа-файла. Вызовите статический метод SoftwareBitmap.Convert , чтобы создать новую растровую карту программного обеспечения с требуемым форматом. Затем создайте новый объект SoftwareBitmapSource и вызовите его SetBitmapAsync , чтобы назначить точечный рисунок программного обеспечения источнику. Наконец, задайте свойство Source элемента управления Image, чтобы отобразить захваченную фотографию в пользовательском интерфейсе.
SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap.Convert(softwareBitmap,
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied);
SoftwareBitmapSource bitmapSource = new SoftwareBitmapSource();
await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);
imageControl.Source = bitmapSource;
SoftwareBitmap softwareBitmapBGR8 = SoftwareBitmap::Convert(softwareBitmap,
BitmapPixelFormat::Bgra8,
BitmapAlphaMode::Premultiplied);
SoftwareBitmapSource bitmapSource;
co_await bitmapSource.SetBitmapAsync(softwareBitmapBGR8);
imageControl().Source(bitmapSource);
Запись видео с помощью CameraCaptureUI
Чтобы записать видео, создайте объект CameraCaptureUI. Используя свойство VideoSettings объекта, можно указать свойства возвращаемого видео, например формат видео.
Вызов CaptureFileAsync и указание видео для записи видео. Метод возвращает экземпляр StorageFile , содержащий видео, если запись выполнена успешно. Если отменить запись, возвращенный объект имеет значение NULL.
CameraCaptureUI captureUI = new CameraCaptureUI();
captureUI.VideoSettings.Format = CameraCaptureUIVideoFormat.Mp4;
StorageFile videoFile = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Video);
if (videoFile == null)
{
// User cancelled photo capture
return;
}
CameraCaptureUI captureUI;
captureUI.VideoSettings().Format(CameraCaptureUIVideoFormat::Mp4);
StorageFile videoFile = co_await captureUI.CaptureFileAsync(CameraCaptureUIMode::Video);
if (!videoFile)
{
// User cancelled photo capture
co_return;
}
То, что вы делаете с захваченным видеофайловом, зависит от сценария приложения. В остальной части этой статьи показано, как быстро создать состав мультимедиа из одного или нескольких захваченных видео и отобразить его в пользовательском интерфейсе.
Сначала добавьте элемент управления MediaPlayerElement , в котором композиция видео будет отображаться на странице XAML.
<MediaPlayerElement x:Name="mediaPlayerElement" Width="320" Height="240" AreTransportControlsEnabled="True"/>
Когда видеофайл возвращается из пользовательского интерфейса записи камеры, создайте новый MediaSource, вызвав CreateFromStorageFile. Вызовите метод Play по умолчанию MediaPlayer, связанный с MediaPlayerElement, чтобы воспроизвести видео.
mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();