정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 고급 사진 캡처

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1만

 

이 항목에서는 고급 사진 캡처 시나리오에 Windows.Phone.Media.Capture API를 사용할 수 있는 방법에 대해서 설명합니다. 사진을 찍는 데 필요한 기본 절차와 사용할 클래스에 대해서도 설명합니다. API에서는 다양한 카메라와, 앱의 사진을 미세 조정하는 데 사용할 수 있는 사진 속성을 제공합니다. PhotoCamera API와 비교하여 Windows.Phone.Media.Capture는 보다 우수한 관리 코드 성능을 제공하며 네이티브 코드에 대한 메서드를 제공합니다. 자세한 내용은 Windows Phone 8용 고급 캡처 속성네이티브 코드용 카메라 API(Windows Phone 8)를 참조하세요.

이 항목에는 다음 단원이 포함되어 있습니다.

 

다음은 사진을 찍고 미디어 라이브러리에 저장하는 데 사용할 수 있는 클래스 중 일부입니다.

클래스

설명

PhotoCaptureDevice

캡처 장치는 카메라를 나타냅니다. 이 캡처 장치는 사진 캡처용입니다. 동영상 캡처에는 AudioVideoCaptureDevice 클래스를 사용합니다.

CameraCaptureSequence

캡처 시퀀스는 프레임 캡처를 위한 작업 단위입니다.

CameraCaptureFrame

프레임은 사진을 캡처 시퀀스로 나타냅니다.

KnownCameraGeneralProperties

일반적인 카메라 속성을 가져오고 설정합니다.

KnownCameraPhotoProperties

사진 속성 가져오고 설정합니다.

MediaLibrary

사진을 휴대폰의 미디어 라이브러리에 저장하는 데 사용됩니다.

MemoryStream

프레임의 이미지 데이터를 미디어 라이브러리에 복사하는 데 사용되는 스트림입니다.

이 클래스 시용 시 다음 지시문을 새 Windows Phone 프로젝트에 추가합니다.

// Directives
using Windows.Phone.Media.Capture;   // For advanced capture APIs
using Microsoft.Xna.Framework.Media; // For the media library
using System.IO;                     // For the memory stream

카메라 및 미디어 라이브러리에 액세스하려면 앱 매니페스트 파일 WMAppManifest.xml에서 기능을 지정해야 합니다. 다음 기능은 Windows Phone 8 의 전면 및 후면 카메라와 미디어 라이브러리에 대한 액세스를 제공합니다.

<Capability Name="ID_CAP_ISV_CAMERA"/>
<Capability Name="ID_CAP_MEDIALIB_PHOTO"/>

카메라 앱에 추가해야 하는 기능 및 하드웨어 요구 사항이 있습니다. 자세한 내용은 Windows Phone 8의 앱 기능 및 하드웨어 요구 사항을 참조하세요.

사진 캡처 장치 개체를 만들려면 OpenAsync 메서드를 사용합니다. 이 메서드에서는 사용할 카메라(CameraSensorLocation 열거형 사용)와 카메라의 초기 캡처 해상도를 지정해야 합니다. 초기 미리 보기 해상도는 초기 캡처 해상도와 휴대폰의 화면 해상도를 기반으로 자동으로 할당됩니다. 나중에, SetCaptureResolutionAsyncSetPreviewResolutionAsync 메서드로 해상도를 설정할 수 있습니다. 휴대폰에서 사용할 수 있는 해상도를 찾으려면 GetAvailableCaptureResolutionsGetAvailablePreviewResolutions 메서드를 사용합니다.

다음 예제에서는 supportedResolutions 목록의 첫 번째 항목을 사용하여 사진 캡처 장치를 만듭니다.

// Check to see if the camera is available on the device.
if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back) ||
    PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front))
{
    // Initialize the camera, when available.
    if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back))
    {
        // Use the back camera.
        System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions = 
            PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back);
        Windows.Foundation.Size res = SupportedResolutions[0];
        this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, res);
    }
    else
    {
        // Otherwise, use the front camera.
        System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions = 
            PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Front);
        Windows.Foundation.Size res = SupportedResolutions[0];
        this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, res);
    }
    ...
    ...
    ...

    //Set the VideoBrush source to the camera.
    viewfinderBrush.SetSource(this.captureDevice);

    // The event is fired when the shutter button receives a half press.
    CameraButtons.ShutterKeyHalfPressed += OnButtonHalfPress;

    // The event is fired when the shutter button receives a full press.
    CameraButtons.ShutterKeyPressed += OnButtonFullPress;

    // The event is fired when the shutter button is released.
    CameraButtons.ShutterKeyReleased += OnButtonRelease; }
else
{
    // The camera is not available.
    this.Dispatcher.BeginInvoke(delegate()
    {
        // Write message.
        txtDebug.Text = "A Camera is not available on this phone.";
    });
}

Windows Phone 의 카메라는 선택 사항이므로 모든 앱은 휴대폰에 카메라가 존재하는지 여부를 확인해야 합니다. 다음 예에서 보듯이 정적 속성 PhotoCaptureDeviceAvailableSensorLocations()를 사용하여 카메라를 확인할 수 있습니다.

캡처 시퀀스는 휴대폰의 CPU에 전송된 작업 단위입니다. 이 시퀀스를 사용하여, 캡처를 시작할 때 일어나는 일을 정의하게 됩니다. 캡처 시퀀스는 사진 캡처 장치의 메서드에서 만들어집니다. 지정해야 하는 유일한 매개 변수는 시퀀스에 포함할 프레임의 수입니다. 이 릴리스에서 이 값은 항상 1입니다. 캡처를 시작하면 이 프레임이 즉시 캡처됩니다.

참고참고:

이 릴리스에서는, CameraCaptureSequence 클래스가 단일 프레임 캡처만을 지원합니다. 그 결과, CreateCaptureSequence 메서드를 호출할 때 단일 프레임을 지정해야 합니다.

다음 예제에서는 캡처 시퀀스를 만드는 방법을 보여 줍니다.

// Create a capture sequence object with 1 frame.
CameraCaptureSequence seq;
seq = cam.CreateCaptureSequence(1);

사진을 캡처할 때 KnownCameraGeneralPropertiesKnownCameraPhotoProperties 메서드를 사용하여 카메라 및 사진 설정을 지정할 수 있습니다. SetProperty 메서드를 사용하여 캡처 시퀀스의 모든 프레임에 영향을 주는 속성을 설정해야 합니다. 사용할 수 있는 속성에 대한 자세한 내용은 Windows Phone 8용 고급 캡처 속성을 참조하세요.

참고참고:

각 휴대폰이 모든 속성을 지원하는 것은 아닙니다. GetSupportedPropertyValues 또는 GetSupportedPropertyRange 메서드를 사용하여 사용할 수 있는 속성 값을 결정합니다.

다음 코드에서는 캡처 장치에 적용되는 설정을 일부 보여 줍니다. 이 속성들은 캡처 시퀀스의 프레임에 적용됩니다.

// Set camera properties.
cam.SetProperty(KnownCameraPhotoProperties.FlashMode, FlashState.On);
cam.SetProperty(KnownCameraGeneralProperties.PlayShutterSoundOnCapture, true);
cam.SetProperty(KnownCameraGeneralProperties.AutoFocusRange, AutoFocusRange.Infinity);

개별 프레임에서도 속성을 설정할 수 있습니다.

// Set the frame properties.
seq.Frames[0].DesiredProperties[KnownCameraPhotoProperties.SceneMode] 
   = CameraSceneMode.Portrait;

DesiredProperties 속성은 “희망 목록”과 같습니다. 각 휴대폰은 프레임에 적용할 수 있는 속성들의 수와 조합에 제한이 있습니다. DesiredProperties로 지정한 속성은 보장되지 않습니다. 캡처 후 실제로 사용된 속성을 확인하려면 프레임의 AppliedProperties 속성을 사용하세요.

중요중요:

PrepareCaptureSequenceAsync 메서드는 모든 DesiredProperties 할당을 따라야 합니다. 캡처 시퀀스를 준비한 후 속성을 변경하면 다시 PrepareCaptureSequenceAsync를 호출해야 합니다.

관리 코드나 네이티브 코드를 사용하여 작업을 할 수 있습니다. 관리 코드에서 프레임의 CaptureStream 속성을 사용하여 프레임의 이미지 데이터를 메모리 스트림에 할당하세요. 이미지 데이터를 미디어 라이브러리에 라우팅하는 데 메모리 스트림을 사용할 수 있습니다.

MemoryStream captureStream1 = new MemoryStream();

// Assign the capture stream.
seq.Frames[0].CaptureStream = captureStream1.AsOutputStream();


팁팁:

프레임을 캡처한 후 프레임의 미리 보기 이미지를 표시하려면 ThumbnailStream 속성을 사용하세요.

프레임을 캡처할 수 있으려면 먼저 캡처 시퀀스를 준비해야 합니다. 이 작업은 PrepareCaptureSequenceAsync 메서드를 호출하여 수행합니다. 이것으로 구성 데이터가 CPU로 전송됩니다. 캡처 시퀀스를 준비한 후 속성을 변경하면 다시 PrepareCaptureSequenceAsync를 호출해야 합니다.

// Prepare the capture sequence.
await cam.PrepareCaptureSequenceAsync(seq);

사용자가 사진을 찍을 준비가 되면 StartCaptureAsync 메서드로 캡처를 시작합니다. await 키워드는 비동기적으로 캡처가 완료되기를 “기다립니다”. 해당 코드가 반환되면 프레임 데이터에 대한 작업을 수행할 수 있습니다. 이 예제에서, 프레임의 캡처 스트림은 미디어 라이브러리에 있는 카메라 앨범 폴더에 이미지를 저장하는 데 사용됩니다.

public async void Capture()
{
   await seq.StartCaptureAsync();

   // Set the stream position to the beginning.
   captureStream1.Seek(0, SeekOrigin.Begin);

   MediaLibrary library = new MediaLibrary();
   Picture picture1 = library.SavePictureToCameraRoll("image1", captureStream1);

}

스트림을 사용하는 많은 API처럼 MediaLibrary 클래스는 스트림에 대한 작업을 하기 전에 스트림의 현재 위치를 조작하지 않습니다. 이때 원하는 경우 스트림의 하위 집합을 사용할 수 있습니다. 이 예제에서는 스트림의 위치를 시작 부분으로 다시 설정하여 전체 이미지가 카메라 앨범 폴더에 저장될 수 있도록 Seek 메서드를 사용합니다.

캡처 후 MemoryStream 개체를 다시 사용할 생각이라면 SetLength를 사용하여 스트림의 길이를 영(0)으로 설정해야 합니다. 그렇지 않으면 다음 캡처가 이 스트림의 끝에 추가됩니다.

팁팁:

MediaLibrarySavePicture() 메서드를 사용하여 사진을 미디어 라이브러리의 저장된 사진 폴더에 저장하세요.

Windows Phone 8 에서는 네이티브 코드에 사용할 수 있는 추가적인 캡처 메서드를 제공합니다. 자세한 내용은 네이티브 코드용 카메라 API(Windows Phone 8)를 참조하세요.

표시: