カメラを使う。
基本的なメソッドだけ。
とりあえずxaml、このrectangleのなかにプレビューが表示される感じ。
<Rectangle Width="300" Height="200" HorizontalAlignment="Left" x:Name="viewfinderContainer"> <Rectangle.Fill> <VideoBrush x:Name="viewfinderBrush" /> </Rectangle.Fill> </Rectangle>
初期化と実行開始。
PhotoCamera cam = new Microsoft.Devices.PhotoCamera(); cam.Initialized += (p1,p2) => { //初期化終了時イベント。これが実行されたあとでないと、Flashなどの設定はできない。 //flashの設定 cam.FlashMode = FlashMode.Off; //Offは大丈夫だが他のモードを使う場合はデバイスが対応するか確認するコードをいれること。 if(cam.IsFlashModeSupported(FlashMode.Auto)){ cam.FlashMode = FlashMode.Auto; } //画像解像度設定 cam.Resolution = cam.AvailableResolutions.OrderByDescending(x => x.Height).FirstOrDefault();//一番でかいの } viewfinderBrush.SetSource(cam);//リアルタイムレンダリングされる。らくちん。
写真を撮る。CaptureImageメソッドをたたくだけ。
//これだけ。 cam.CaptureImageAvailable += (p1,p2)=>{ //保存処理。 //p2.ImageStreamをお好きなように }; cam.CaptureImage(); //オートフォーカスが必要ならこう。 cam.AutoFocusCompleted += (p1,p2)=>{ cam.CaptureImage(); }; cam.Focuse(); //上記方法ではIS12Tでシャッタ音がなる。 //消す方法は未調査 //鳴らさない方法としてはコントロールのキャプチャを使う方法がある。 var wb = new WriteableBitmap(viewfinderContainer, null); //あとはWritaebleBItmapをお好きなように
画像の保存
//イメージストリームを保存 Microsoft.Xna.Framework.Media.MediaLibrary library = new MediaLibrary(); library.SavePictureToCameraRoll(fileName, e.ImageStream);//通常はCaptureImageイベントのArgs //writeableBitmapを保存 //一度IsolatedStorageに保存する String tempJPEG = "TempJPEG"; var myStore = IsolatedStorageFile.GetUserStoreForApplication(); if (myStore.FileExists(tempJPEG)) { myStore.DeleteFile(tempJPEG); } IsolatedStorageFileStream myFileStream = myStore.CreateFile(tempJPEG); Extensions.SaveJpeg(wb, myFileStream, wb.PixelWidth, wb.PixelHeight, 0, 85); myFileStream.Close(); // 分離ストレージからPicturesHubにコピーする。 MediaLibrary library = new MediaLibrary(); myFileStream = myStore.OpenFile(tempJPEG, FileMode.Open, FileAccess.Read); library.SavePicture(fileName, myFileStream); myFileStream.Close();
おまけ。シャッターボタン関連のイベントはこの辺なので、標準と同じような動きするならあわせたほうがよさそうですね。
CameraButtons.ShutterKeyHalfPressed += OnButtonHalfPress;//普通ならAF開始 CameraButtons.ShutterKeyPressed += OnButtonFullPress;//普通ならシャッター CameraButtons.ShutterKeyReleased += OnButtonRelease;//普通ならAF中止