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와 연결된 기본 MediaPlayerPlay 메서드를 호출하여 비디오를 재생합니다.

mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile);
mediaPlayerElement.MediaPlayer.Play();
mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile));
mediaPlayerElement().MediaPlayer().Play();