Windows Phoneアプリケーション開発入門

第35回 Mangoで追加されたカメラ機能を使ってみよう!(1)

この記事を読むのに必要な時間:およそ 4 分

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

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

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のソースを設定しているので,カメラプレビューが開始されます。

画像

オートフォーカスを開始する

カメラはピントが合っていないとボケた映像になります。ピントを合わせて綺麗にプレビューさせたり静止画撮影を行う為にはフォーカスを調整する必要があります。PhotoCameraクラスには,Focusという自動でピントを合わせるメソッドがあります。

// オートフォーカス処理を開始する
camera.Focus();

Windows Phoneの標準のカメラアプリケーションでは,プレビュー画面をタップするとオートフォーカスを行います。サンプルプロジェクトの方でも同じ様に実装してみましょう。カメラプレビューを表示している矩形のPreviewRectangleがタップされるのをトリガーにして,PhotoCamera.Focusメソッドを呼び出します。

MainPage.xamlで配置しているPreviewRectangleにTapイベントのハンドラを追加してください。

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

AutoFocusCompletedイベントのハンドラを設定して,PhotoCamera.Focusメソッドを使います。フォーカス調整が完了するとcamera_AutoFocusCompletedメソッドが呼ばれます。

// 表示領域がタップされるとオートフォーカス処理を開始する
private void PreviewRectangle_Tap(object sender, System.Windows.Input.GestureEventArgs e) {
    if (camera == null) {
        return;
    }

    System.Diagnostics.Debug.WriteLine("AutoFocus Start: " + DateTime.Now.ToString("HH:mm:ss.fff"));
    camera.AutoFocusCompleted += camera_AutoFocusCompleted;
    // オートフォーカス処理を開始する
    camera.Focus();
}

// オートフォーカスの完了
void camera_AutoFocusCompleted(object sender, CameraOperationCompletedEventArgs e) {
    camera.AutoFocusCompleted -= camera_AutoFocusCompleted;
    System.Diagnostics.Debug.WriteLine("AutoFocus End  : " + DateTime.Now.ToString("HH:mm:ss.fff"));
}

実機にサンプルアプリケーションをデプロイしてみました。アプリケーションが起動するとプレビューが始まりますので,画面をタップしオートフォーカス処理を行い,ピントを合わせました。

画像

オートフォーカスを中止する

前述のオートフォーカス処理は少し時間が掛かってしまいます。実機(HTC Mozart)上で,オートフォーカスの開始から終了まで約2秒ほど掛かりました。

おそらく端末によって処理に掛かる時間の加減はありますが,少し時間の掛かる処理であることは間違いありません。処理中にオートフォーカスを中止するには,PhotoCamera.CancelFocusメソッドを使用します。

// オートフォーカス処理を中止する
camera.CancelFocus();

さいごに

カメラプレビューとオートフォーカスの使い方をご紹介させて頂きました。次回はカメラを使っての静止画撮影とフラッシュモードの使い方についてご紹介させて頂きたいと思います。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/