Windows 기본 카메라 UI를 사용하여 사진 및 비디오 캡처
이 문서에서는 CameraCaptureUI 클래스를 사용하여 Windows에 기본 제공된 카메라 UI를 통해 사진 또는 비디오를 캡처하는 방법을 설명합니다. 이 기능은 사용하기 쉽습니다. 이를 통해 몇 줄의 코드만으로 앱에서 사용자가 캡처한 사진 또는 비디오를 가져올 수 있습니다.
사용자 고유의 카메라 UI를 제공하거나 시나리오에서 캡처 작업에 대해 더 강력한 하위 수준의 제어가 필요한 경우 MediaCapture 클래스를 사용하고 사용자 고유의 캡처 환경을 구현해야 합니다. 자세한 내용은 MediaCapture를 사용한 기본 사진, 비디오 및 오디오 캡처를 참조하세요.
참고 항목
앱에서 CameraCaptureUI만 사용하는 경우 웹캠 또는 마이크 기능을 앱 매니페스트 파일에 지정하면 안 됩니다. 이렇게 하면 앱이 디바이스의 카메라 개인 정보 설정에 표시되지만 사용자가 앱에 대한 카메라 액세스를 거부하더라도 CameraCaptureUI의 미디어 캡처가 차단되지 않습니다.
Windows 기본 제공 카메라 앱은 사용자가 단추를 눌러 사진, 오디오 및 비디오 캡처를 시작해야 하는 신뢰할 수 있는 자사 앱이기 때문입니다. CameraCaptureUI를 유일한 사진 캡처 메커니즘으로 사용할 때 웹캠 또는 마이크 기능을 지정하면 앱이 Microsoft Store에 제출될 때 Windows 애플리케이션 인증 키트 인증에 실패할 수 있습니다.
MediaCapture를 사용하여 오디오, 사진 또는 비디오를 프로그래밍 방식으로 캡처하는 경우 앱 매니페스트 파일에서 웹캠 또는 마이크 기능을 지정해야 합니다.
CameraCaptureUI로 사진 캡처
카메라 캡처 UI를 사용하려면 프로젝트에 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 속성을 사용하여 사진의 이미지 형식과 같은 반환된 사진에 대한 속성을 지정할 수 있습니다. 기본적으로 카메라 캡처 UI는 반환되기 전에 사진 자르기를 지원합니다. 이는 AllowCropping 속성으로 사용하지 않도록 설정할 수 있습니다. 다음은 반환된 이미지를 200 x 200 픽셀로 요청하도록 CroppedSizeInPixels를 설정하는 예제입니다.
참고 항목
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();
앱에서 사진을 사용하려면 여러 다른 유니버설 Windows 앱 기능과 함께 사용할 수 있는 SoftwareBitmap 개체를 만들 수 있습니다.
먼저 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();
UI에 이미지를 표시하려면 XAML 페이지에서 Image 컨트롤을 선언합니다.
<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;
Image 컨트롤을 사용하려면 이미지 원본이 미리 곱한 알파가 있거나 알파가 없는 BGRA8 형식이어야 합니다. SoftwareBitmap.Convert 정적 메서드를 호출하여 새 소프트웨어 비트맵을 원하는 형식으로 만듭니다. 다음으로, 새 SoftwareBitmapSource 개체를 만들고, SetBitmapAsync를 호출하여 소프트웨어 비트맵을 원본에 할당합니다. 마지막으로 이미지 컨트롤의 Source 속성을 설정하여 캡처한 사진을 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 개체를 만듭니다. 개체의 VideoSettings 속성을 사용하여 비디오의 형식과 같은 반환된 비디오에 대한 속성을 지정할 수 있습니다.
CaptureFileAsync를 호출하고 비디오를 캡처하도록 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;
}
캡처된 동영상 파일로 수행하는 일은 앱 시나리오에 따라 달라집니다. 이 문서의 나머지 부분에는 하나 이상의 캡처된 동양싱에서 미디어 컴퍼지션을 빠르게 만들고 UI에 표시하는 방법이 나와 있습니다.
먼저 비디오 컴퍼지션에서 XAML 페이지에 표시할 MediaPlayerElement 컨트롤을 추가합니다.
<MediaPlayerElement x:Name="mediaPlayerElement" Width="320" Height="240" AreTransportControlsEnabled="True"/>
비디오 파일이 카메라 캡처 UI에서 반환되면 CreateFromStorageFile을 호출하여 새 MediaSource를 만듭니다. MediaPlayerElement와 연결된 기본 MediaPlayer의 Play 메서드를 호출하여 비디오를 재생합니다.
mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();