Поделиться через


Фото- и видеосъемка с использованием встроенного пользовательского интерфейса камеры в 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();