だらだらやるよ。

こげつのIT技術メモ

カメラを使う。

基本的なメソッドだけ。

とりあえず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中止