エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

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 列挙を使用)、さらにカメラの初期キャプチャ解像度を指定する必要があります。初期プレビュー解像度は、初期キャプチャ解像度および電話機の画面解像度を元にして自動的に割り当てられます。後の段階で SetCaptureResolutionAsync メソッドおよび SetPreviewResolutionAsync メソッドを使用して、解像度を設定することができます。電話で使用可能な解像度を確認するには、GetAvailableCaptureResolutions メソッドと GetAvailablePreviewResolutions メソッドを使用します。

次の例では、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 メソッドを呼び出すときに 1 つのフレームを指定する必要があります。

キャプチャ シーケンスの作成方法を次の例に示します。

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

写真をキャプチャするときは、KnownCameraGeneralProperties メソッドと KnownCameraPhotoProperties メソッドを使用して、カメラと写真の設定を指定することができます。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 キーワードにより、キャプチャの完了を非同期的に "待機" します。このコードが復帰したら、フレーム データの操作を実行することができます。この例では、フレームからのキャプチャ ストリームを使用して、メディア ライブラリ内の Camera Roll フォルダーにイメージを保存します。

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() メソッドを使用して、メディア ライブラリ内の Saved Pictures フォルダーに写真を保存します。

Windows Phone 8 は、ネイティブ コードで使用できる追加のキャプチャ メソッドを提供します。詳細については、「ネイティブ コード用のカメラ API (Windows Phone 8)」を参照してください。

表示:
© 2015 Microsoft