Windows 기본 카메라 UI를 사용하여 사진 및 비디오 캡처Capture photos and video with the Windows built-in camera UI

이 문서에서는 Windows에 기본 제공 되는 카메라 UI를 사용 하 여 사진이 나 비디오를 캡처하는 CameraCaptureUI 클래스를 사용 하는 방법을 설명 합니다.This article describes how to use the CameraCaptureUI class to capture photos or videos by using the camera UI built into Windows. 이 기능을 사용 하는 것이 쉽습니다.This feature is easy to use. 이를 통해 앱은 코드를 몇 줄만 사용 하 여 사용자가 캡처한 사진 또는 비디오를 가져올 수 있습니다.It allows your app to get a user-captured photo or video with just a few lines of code.

사용자 고유의 카메라 UI를 제공 하거나 시나리오에서 캡처 작업에 대 한 보다 강력 하 고 낮은 수준의 제어를 요구 하는 경우 MediaCapture 클래스를 사용 하 여 사용자 고유의 캡처 환경을 구현 해야 합니다.If you want to provide your own camera UI, or if your scenario requires more robust, low-level control of the capture operation, then you should use the MediaCapture class, and implement your own capture experience. 자세한 내용은 MediaCapture를 사용 하 여 기본 사진, 비디오 및 오디오 캡처를 참조 하세요.For more information, see Basic photo, video, and audio capture with MediaCapture.

참고

앱에서 CameraCaptureUI만 사용 하는 경우 앱 매니페스트 파일에서 웹캠마이크 기능을 지정 하면 안 됩니다.You shouldn't specify the webcam nor microphone capabilities in your app manifest file if your app only uses CameraCaptureUI. 이렇게 하면 앱이 장치의 카메라 개인 정보 설정에 표시 되지만 사용자가 앱에 대 한 카메라 액세스를 거부 하는 경우에도 CameraCaptureUI 미디어를 캡처하지 못하게 됩니다.If you do, your app will be displayed in the device's camera privacy settings, but even if the user denies camera access to your app, this won't prevent the CameraCaptureUI from capturing media.

Windows 기본 제공 카메라 앱은 사용자가 단추를 눌러 사진, 오디오 및 비디오 캡처를 시작 해야 하는 신뢰할 수 있는 자사 앱 이기 때문입니다.This is because the Windows built-in camera app is a trusted first-party app that requires the user to initiate photo, audio, and video capture with a button press. CameraCaptureUI 를 유일한 사진 캡처 메커니즘으로 사용할 때 웹캠 또는 마이크 기능을 지정 하는 경우 앱에서 Windows 응용 프로그램 인증 키트 인증 Microsoft Store에 실패할 수 있습니다.Your app may fail Windows Application Certification Kit certification when submitted to Microsoft Store if you specify the webcam or microphone capabilities when using CameraCaptureUI as your only photo capture mechanism.

MediaCapture 를 사용 하 여 오디오, 사진 또는 비디오를 프로그래밍 방식으로 캡처하는 경우 앱 매니페스트 파일에서 웹캠 또는 마이크 기능을 지정 해야 합니다.You must specify the webcam or microphone capabilities in your app manifest file if you're using MediaCapture to capture audio, photos, or video programmatically.

CameraCaptureUI를 사용 하 여 사진 캡처Capture a photo with CameraCaptureUI

카메라 캡처 UI를 사용하려면 프로젝트에 Windows.Media.Capture 네임스페이스를 포함합니다.To use the camera capture UI, include the Windows.Media.Capture namespace in your project. 반환 된 이미지 파일을 사용 하 여 파일 작업을 수행 하려면 Windows 저장소를 포함 합니다.To do file operations with the returned image file, include 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 개체를 만듭니다.To capture a photo, create a new CameraCaptureUI object. 개체의 사진 설정 속성을 사용 하 여 사진의 이미지 형식과 같은 반환 된 사진의 속성을 지정할 수 있습니다.By using the object's PhotoSettings property, you can specify properties for the returned photo, such as the image format of the photo. 기본적으로 카메라 캡처 UI는 반환 되기 전에 사진 잘라내기를 지원 합니다.By default, the camera capture UI supports cropping the photo before it's returned. 이는 Allowcropping 속성으로 사용 하지 않도록 설정할 수 있습니다.This can be disabled with the AllowCropping property. 이 예제에서는 반환 된 이미지를 200 x 200 (픽셀)로 요청 하도록 CroppedSizeInPixels 를 설정 합니다.This example sets the CroppedSizeInPixels to request that the returned image be 200 x 200 in pixels.

참고

모바일 장치 제품군의 장치에 대해서는 CameraCaptureUI 의 이미지 자르기가 지원 되지 않습니다.Image cropping in the CameraCaptureUI isn't supported for devices in the Mobile device family. 이러한 장치에서 앱이 실행 되는 경우 Allowcropping 속성의 값이 무시 됩니다.The value of the AllowCropping property is ignored when your app is running on these devices.

CaptureFileAsync 를 호출 하 고 CameraCaptureUIMode 를 지정 하 여 사진을 캡처해야 하도록 지정 합니다.Call CaptureFileAsync and specify CameraCaptureUIMode.Photo to specify that a photo should be captured. 이 메서드는 캡처가 성공한 경우 이미지를 포함 하는 StorageFile 인스턴스를 반환 합니다.The method returns a StorageFile instance containing the image if the capture is successful. 사용자가 캡처를 취소 하면 반환 되는 개체는 null입니다.If the user cancels the capture, the returned object is 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 에는 동적으로 생성 된 이름이 지정 되 고 앱의 로컬 폴더에 저장 됩니다.The StorageFile containing the captured photo is given a dynamically generated name and saved in your app's local folder. 캡처한 사진을 보다 잘 구성 하기 위해 파일을 다른 폴더로 이동할 수 있습니다.To better organize your captured photos, you can move the file to a different folder.

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 앱 기능에서 사용할 수 있는 기능 비트맵 개체를 만들 수 있습니다.To use your photo in your app, you may want to create a SoftwareBitmap object that can be used with several different Universal Windows app features.

먼저 프로젝트에 Windows. Graphics. Imaging 네임 스페이스를 포함 합니다.First, include the Windows.Graphics.Imaging namespace in your project.

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 를 호출 하 여 이미지 파일에서 스트림을 가져옵니다.Call OpenAsync to get a stream from the image file. Bitmapdecoder에서 를 호출 하 여 스트림에 대 한 비트맵 디코더를 가져옵니다.Call BitmapDecoder.CreateAsync to get a bitmap decoder for the stream. 그런 다음 Getsoftwarebitmap 을 호출 하 여 이미지의 \bitmap 표현을 가져옵니다.Then, call GetSoftwareBitmap to get a SoftwareBitmap representation of the image.

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 페이지에서 이미지 컨트롤을 선언 합니다.To display the image in your UI, declare an Image control in your XAML page.

<Image x:Name="imageControl" Width="200" Height="200"/>
<Image x:Name="imageControl" Width="200" Height="200"/>

XAML 페이지에서 소프트웨어 비트맵을 사용 하려면 프로젝트에 사용 하는 Windows. x m l. x m l. x m l 네임 스페이스를 포함 합니다.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;

이미지 컨트롤을 사용 하려면 이미지 원본이 미리 증가 된 알파를 사용 하거나 알파를 사용 하지 않는 BGRA8 형식 이어야 합니다.The Image control requires that the image source be in BGRA8 format with premultiplied alpha or no alpha. 정적 메서드를 호출 하 여 원하는 형식의 새 소프트웨어 비트맵을 만듭니다 .Call the static method SoftwareBitmap.Convert to create a new software bitmap with the desired format. 그런 다음 새 SoftwareBitmapSource 개체를 만들고 SetBitmapAsync 를 호출 하 여 소프트웨어 비트맵을 원본에 할당 합니다.Next, create a new SoftwareBitmapSource object and call it SetBitmapAsync to assign the software bitmap to the source. 마지막으로, 이미지 컨트롤의 Source 속성을 설정 하 여 캡처된 사진을 UI에 표시 합니다.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를 사용 하 여 비디오 캡처Capture a video with CameraCaptureUI

비디오를 캡처하려면 새 CameraCaptureUI 개체를 만듭니다.To capture a video, create a new CameraCaptureUI object. 개체의 Videosettings 속성을 사용 하 여 비디오 형식과 같이 반환 된 비디오에 대 한 속성을 지정할 수 있습니다.By using the object's VideoSettings property, you can specify properties for the returned video, such as the format of the video.

CaptureFileAsync 를 호출 하 고 비디오를 지정 하 여 비디오를 캡처합니다.Call CaptureFileAsync and specify Video to capture a video. 이 메서드는 캡처가 성공한 경우 비디오를 포함 하는 StorageFile 인스턴스를 반환 합니다.The method returns a StorageFile instance containing the video if the capture is successful. 캡처를 취소 하면 반환 되는 개체는 null입니다.If you cancel the capture, the returned object is 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;
}

캡처한 비디오 파일을 사용 하 여 수행 하는 작업은 앱의 시나리오에 따라 달라 집니다.What you do with the captured video file depends on the scenario for your app. 이 문서의 나머지 부분에서는 캡처된 비디오 하나 이상에서 미디어 컴퍼지션을 빠르게 만들고 UI에 표시 하는 방법을 보여 줍니다.The rest of this article shows you how to quickly create a media composition from one or more captured videos and show it in your UI.

먼저 XAML 페이지에 비디오 컴포지션이 표시 되는 MediaPlayerElement 컨트롤을 추가 합니다.First, add a MediaPlayerElement control in which the video composition will display on your XAML page.

<MediaPlayerElement x:Name="mediaPlayerElement" Width="320" Height="240" AreTransportControlsEnabled="True"/>

비디오 파일이 카메라 캡처 UI에서 반환 되는 경우 CreateFromStorageFile 를 호출 하 여 새 MediaSource 를 만듭니다.When the video file returns from the camera capture UI, create a new MediaSource by calling CreateFromStorageFile. MediaPlayerElement 와 연결 된 기본 MediaPlayerplay 메서드를 호출 하 여 비디오를 재생 합니다.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();