MangoとCamera
Windows Phone 7プラットホームで開発者を最もがっかりさせたものの一つはカメラの利用方法だろう。というのもMango(7.5)前までのWindows Phone 7はカメラデバイスのデータストリームをアプリケーションから直接扱うことが許されておらず、カメラアプリで撮影した静止画像をキャプチャするしか選択肢が無いからだ。※
カメラアプリを使ってCameraCaptureTaskを構成する (Mango以前)
CameraCaptureTask camera = new CameraCaptureTask(); camera.Completed += (sender, args) => { if (args.ChosenPhoto != null) { BitmapImage bmp = new BitmapImage(); bmp.SetSource(args.ChosenPhoto); img.Source = bmp; } }; camera.Show();
- 実行結果
この方法だと写真を保存したり編集したりするアプリケーションなら作れそうだが、Androidの有名なZXing-QRリーダのように常時カメラからの映像をキャプチャし続けて目的の画像を検出したり、同じくAndroidのAR(Augumented Reality)アプリケーションであるLayerやSekai Cameraのようにカメラの映像に作られた画像や3Dポリゴンを重ねて描画するようなことは絶対にできない。
つまりはカメラデバイスから刻一刻と送られてくる画像データを扱えない訳で、凝ったカメラアプリケーションは作れなかった状況が続いていた訳だ。
この制限はついにMango(Windows Phone 7.5)によって解除される。
MangoではMicrosoft.Devices.Camera抽象クラスとMicrosoft.Devices.PhotoCamera具象クラスを追加されており、これらは System.Windows.Media.VideoBrushクラスのSourceとしてセットすることが出来る。すなわち、カメラデバイスから入力された映像ストリームを描画できるという訳だ。
PhotoCameraクラスを使って現在のカメラ映像からバーコードを検出する(Mango)
-
- C# Source
PhotoCamera camera; camera = new PhotoCamera(); camera.Initialized += (sender, e1) => { camera.Resolution = camera.AvailableResolutions.Last(); Detect(); }; ViewFinderBrush.SetSource(camera); private void Detect() { camera.Focus(); Dispatcher.BeginInvoke(() => { txtStatus.Text = "Scanning..."; if (camera != null) { var width = (int)camera.PreviewResolution.Width; var height = (int)camera.PreviewResolution.Height; byte[] imageData = new byte[height * width]; camera.GetPreviewBufferY(imageData); var wb = new WriteableBitmap(width, height); imageData.CopyTo(wb.Pixels, 0); wb.Invalidate(); Result res = ScanBarcode(wb);//バーコードをスキャン(省略) if ( res != null ) { return; } Detect(); } }); }
これでAndroid等と同様、いやそれ以上に容易にカメラのフレームデータを直接扱うことができるようになった訳で、随分とカメラアプリケーションの敷居が下がるのではないだろうか。
参考:How to: Create a Base Camera Application for Windows Phone - MSDN Library
※非公式な方法としてMicrosoft.Phone.Media.Extended.dllを利用することも出来たらしい。