Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как использовать класс CameraCaptureUI для записи фотографий или видео с помощью пользовательского интерфейса камеры, встроенного в Windows. Эта функция легко используется. Это позволяет приложению получать захваченные пользователем фотографии или видео с несколькими строками кода.
Примечание.
The CameraCaptureUI class in the Windows.Media.Capture namespace is only supported for UWP apps. For desktop apps using WinUI 3, use the new version of this feature in the Microsoft.Windows.Media.Capture namespace. For more information, see Capture photos and video in a desktop app with the Windows built-in camera UI.
Если вы хотите предоставить собственный пользовательский интерфейс камеры или если для вашего сценария требуется более надежный, низкий уровень управления операцией захвата, следует использовать класс MediaCapture и реализовать собственный интерфейс записи. Дополнительные сведения см. в разделе Основы фото-, видео- и аудиосъемки с использованием MediaCapture.
Примечание.
You shouldn't specify the webcam nor microphone capabilities in your app manifest file if your app only uses CameraCaptureUI. Если это сделать, ваше приложение будет отображаться в параметрах конфиденциальности камеры устройства, но даже если пользователь запрещает доступ к камере вашему приложению, это не помешает CameraCaptureUI осуществлять захват медиафайлов.
Это связано с тем, что встроенное приложение камеры Windows является доверенным первым приложением, которое требует от пользователя инициировать фото, звук и видеозахват с помощью нажатия кнопки. Ваше приложение может не пройти проверку совместимости Windows Application Certification Kit при отправке в Microsoft Store, если вы указываете возможности веб-камеры или микрофона при использовании CameraCaptureUI в качестве единственного механизма захвата фотографий.
В файле манифеста приложения необходимо указать возможности веб-камеры
Захват фотографии с помощью 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 объекта, можно указать свойства возвращаемой фотографии, например формат изображения фотографии. By default, the camera capture UI supports cropping the photo before it's returned. Это можно отключить с помощью свойства AllowCropping. This example sets the CroppedSizeInPixels to request that the returned image be 200 x 200 in pixels.
Примечание.
Обрезка изображений в CameraCaptureUI не поддерживается для устройств в семействе мобильных устройств. Значение свойства AllowCropping игнорируется при запуске приложения на этих устройствах.
Вызовите CaptureFileAsync и укажите CameraCaptureUIMode.Photo, чтобы указать, что фотография должна быть записана. Метод возвращает экземпляр StorageFile
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();
Чтобы отобразить изображение в пользовательском интерфейсе, объявите элемент управления Image на странице XAML.
<Image x:Name="imageControl" Width="200" Height="200"/>
<Image x:Name="imageControl" Width="200" Height="200"/>
To use the software bitmap in your XAML page, include the using Windows.UI.Xaml.Media.Imaging namespace in your project.
using Windows.UI.Xaml.Media.Imaging;
#include <winrt/Windows.UI.Xaml.Media.Imaging.h>
using namespace Windows::UI::Xaml::Media::Imaging;
The Image control requires that the image source be in BGRA8 format with premultiplied alpha or no alpha. Вызовите статический метод SoftwareBitmap.Convert, чтобы создать новую растровую карту программного обеспечения с нужным форматом. Затем создайте новый объект SoftwareBitmapSource и вызовите его SetBitmapAsync, чтобы назначить растровое изображение программного обеспечения источнику. Finally, set the Image control's Source property to display the captured photo in the UI.
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. С помощью свойства VideoSetting s объекта можно указать свойства возвращаемого видео, например формат видео.
Call CaptureFileAsync and specify Video to capture a video. Метод возвращает экземпляр 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"/>
When the video file returns from the camera capture UI, create a new MediaSource by calling CreateFromStorageFile. Call the Play method of the default MediaPlayer associated with the MediaPlayerElement to play the video.
mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();