読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

MediaCaptureで写真を撮るには

MediaCapture

カメラで写真をとるだけならCameraCaptureUIを使うと楽に写真を撮ることができます。

しかし、CameraCaptureUIは既存のUIを使用するので自分でキャプチャ部分を定義できません。

 

自由度が高く、独自のUIを使って写真を撮りたいならMediaCaptureを使います。

 

まずはデバイス列挙をしてどのカメラを使うかを選択します。

DeviceClass.VideoCaptureを指定することでカメラデバイスだけを列挙することができます。

今回は0番目のカメラを使用します。

DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
DeviceInformation cameraId=devices.ElementAt(0);

 

MediaCaptureInitializationSettingでどのデバイスを使うのかIdを設定します。

var setting = new MediaCaptureInitializationSettings();
setting.VideoDeviceId = cameraId.Id;

 

次にMediaCaptureをnewし、InitializeAsyncでカメラの初期化を行います。

このとき、先ほど作ったMediaCaptureInitializationSettingを引数にいれます。

InitializeAsyncに何も引数をいれない場合、どれか一つのWebカメラが使用されます。

MediaCapture mediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync(setting);

 

現在カメラで写している画面をPreviewするためにcaptureElementコントロールをXAMLに配置し、

そのSourceにmediaCaptureのインスタンスを渡します。

<CaptureElement x:Name="captureElement" />

 

captureElement.Source = mediaCapture;

WindowsPhoneの場合、Preview画面が270度回転してしまっているので270度回転させておきます。

#if WINDOWS_PHONE_APP
            mediaCapture.SetPreviewRotation(VideoRotation.Clockwise270Degrees);
#endif

 

ここまでで初期化は完了です。

 

Previewする場合はStartPreViewAsyncメソッドを呼び出します。

await mediaCapture.StartPreviewAsync();

 

写真を撮るときは、CapturePhotoToStorageFileAsyncメソッドを呼び出します。

引数にImageEncodingProperties列挙体メンバーをいれることでjpgやpngを指定することができます。

今回はカメラロールに取得した写真を保存します。

StorageFolder cameraRollFolder = KnownFolders.CameraRoll;
StorageFile file = await cameraRollFolder.CreateFileAsync("hoge.jpg",CreationCollisionOption.ReplaceExisting);
await mediaCapture.CapturePhotoToStorageFileAsync(ImageEncodingProperties.CreateJpeg(),file);

 

終了するときは、

StopPreviewAsyncでプレビューを終了し、DisposeメソッドでMediaCaptureのリソースを正しく破棄します。

await mediaCapture.StopPreviewAsync();
mediaCapture.Dispose();

 

サスペンド時に正しく終了処理をしましょう。

App.Current.Suspending += async(s, e) =&gt;
{
    var deferral = e.SuspendingOperation.GetDeferral();
    
    await mediaCapture.StopPreviewAsync();
    mediaCapture.Dispose();
    // TODO: アプリケーションの状態を保存してバックグラウンドの動作があれば停止します
    deferral.Complete();
   
};

 

 

実行するときはマニフェストファイルのWebカメラにチェックをいれましょう。今回はカメラロールも使用するので画像ライブラリにもチェックをいれます。

21

MediaCpatureで写真を撮るには | garicchi.com