Windows PhoneでPhotoCameraクラスを使ってカメラプレビューを行う

By | 2013/04/22
Pocket

Windows Phone OS 7.1になってから、アプリケーションからカメラ機能を扱えるようになりました。ここではWindows Phone OS 7.1でカメラプレビューを行う方法について紹介します。

Windows Phone OS 7.0ではカメラプレビューを行うためには、非公開クラスライブラリのMicrosoft.Phone.Media.Extended.dllを使用する必要があります。リンクから関連ページを参照してください。

カメラプレビューをおこなうための前準備については、[PhotoCameraクラスを使うための前準備](http://ch3cooh.jp/windows-phone/wp-multimedia/prepare-photocamera-wp/)を参考にして頂ければと思います。

## カメラプレビューをおこなうための前準備

ソリューションエクスプローラーからCameraPreviewTestプロジェクトを右クリックし、「参照の追加」を選択してください。.NETタブにMicrosoft.XNA.Frameworkがあると思いますので追加を行います。

MainPage.xamlの`LayoutRoot`という名前のGridを以下のコードで置き換えてください。カメラプレビューを表示する為の`PreviewRectangle`という名前の矩形(Rectangle)を追加しています。

矩形を塗りつぶすBrushオブジェクトの一種に、単色で塗りつぶすSolidColorBrushがあります。これと同様に動画で塗りつぶすVideoBrushを使って、カメラデバイスから入力されたプレビューフレームでPreviewRectangleの矩形を塗りつぶします。

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="PageTitle" Text="CameraPreviewTest" 
                       Margin="9,-7,0,0" 
                       Style="{StaticResource PhoneTextTitle2Style}"/>
        </StackPanel>

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <!-- この矩形にカメラプレビューを表示する -->
            <Rectangle x:Name="PreviewRectangle">
                <Rectangle.Fill>
                    <VideoBrush x:Name="PreviewBrush" />
                </Rectangle.Fill>
            </Rectangle>
        </Grid>
    </Grid>

## カメラプレビューを開始する

カメラプレビューを表示させるだけであれば、生成したPhotoCameraオブジェクトをPhotoCamera.SetSourceメソッドで、カメラにVideoBrushのソースを設定するだけです。

protected override void OnNavigatedTo(NavigationEventArgs e) {
    camera = new PhotoCamera();
    PreviewBrush.SetSource(camera);
}

端末にはカメラデバイスが搭載されていますが、大抵の場合カメラデバイスは端末に対して横向きに搭載されているので、表示の際に回転させる必要があります。

カメラの初期化が完了するとInitializedイベントが発行されます。camera_Initializedメソッドでブラシへ回転処理を適用します。

using System;
using System.Windows.Navigation;
using System.Windows.Media;
using Microsoft.Phone.Controls;
using Microsoft.Devices;

namespace CameraPreviewTest {
    public partial class MainPage : PhoneApplicationPage {

        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        PhotoCamera camera = null;

        // ページがフレームでアクティブになったら呼び出される
        protected override void OnNavigatedTo(NavigationEventArgs e) {
            camera = new PhotoCamera();
            camera.Initialized += camera_Initialized;
            PreviewBrush.SetSource(camera);
        }

        // ページがフレームでアクティブでなくなったら呼び出される
        protected override void OnNavigatedFrom(NavigationEventArgs e) {
            if (camera != null) {
                camera.Dispose();
                camera = null;
            }
        }

        // カメラの初期化処理の完了
        void  camera_Initialized(object sender, CameraOperationCompletedEventArgs e) {
            // 初期化処理に失敗した場合は何もしない
            if (!e.Succeeded)
                return;

            // カメラの回転角度に合わせてプレビュー表示も回転させる
            Dispatcher.BeginInvoke(() => {
                PreviewBrush.RelativeTransform = new CompositeTransform() {
                    CenterX = 0.5, CenterY = 0.5,
                    Rotation = camera.Orientation
                };
            });
        }
    }
}

アプリケーションを起動し、ページがフレームでアクティブになったらOnNavigatedToメソッドが呼び出されます。このメソッドにてカメラに対してVideoBrushのソースを設定しているので、カメラプレビューが開始されます。

## 参照

* [How to: Create a Base Camera Application for Windows Phone](http://msdn.microsoft.com/en-us/library/hh202956%28v=vs.92%29.aspx)