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

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

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

はじめに

先日,世界初となるWindows Phone 7.5端末のIS12Tが発売されました。現時点(2011年9月12日)ではWindows Phone 7.5が搭載された端末はこの1台だけです。

IS12Tには,13.2Mの高画質カメラが搭載されています。前回カメラプレビューの表示に使ったプロジェクトを拡張して,フラッシュモードの設定,撮影解像度の取得と設定,静止画撮影を行うまでをご紹介させていただきます。

前回から機能を追加したサンプルプロジェクトを用意しましたので,是非ソースコードと一緒に記事を読み進めて頂ければと思います。

フラッシュモードを設定する

静止画撮影を行う上で必要なフラッシュモードの設定と撮影解像度の設定についてご紹介したいと思います。

標準カメラはデフォルトで,被写体の周りが暗い場合にカメラ撮影時にフラッシュを炊く設定になっています。フラッシュを発光させるかどうかの設定値はenumで定義されています。

Windows Phone OS 7.1で定義されているフラッシュモードは下記の通りです。

フラッシュモード 説明
FlashMode.On フラッシュは常にON
FlashMode.Auto 自動発光モード
FlashMode.Off フラッシュは常にOFF
FlashMode.RedEyeReduction 赤目補正モード

フラッシュモードがFlashMode.On,FlashMode.RedEyeReductionの場合,必ずフラッシュが発光します。FlashMode.Autoの場合にWindows Phone OSがフラッシュをさせるかどうかを判定し,必要であればカメラ撮影時にフラッシュが発光します。

FlashMode.Offの場合フラッシュは発光しません。

フラッシュモードを設定する

上記の表の通り,定義としてはフラッシュモードが4つありますが,それぞれのWindows Phone端末でハードウェア的にサポートしていない可能性があります。

そこでまずPhotoCamera.IsFlashModeSupportedメソッドを使用して,現在のカメラでそのフラッシュモードが使用できるのかを判定し,使用可能であればフラッシュモードの設定を変更するようにします。

// フラッシュモードの設定を行う
// カメラが赤目補正モードに対応しているか判定する
if (camera.IsFlashModeSupported(FlashMode.RedEyeReduction)) {
    camera.FlashMode = FlashMode.RedEyeReduction;
}

余談ですが,カメラのフラッシュを懐中電灯代わりに使用しているアプリケーションが公開されているのをMarketplaceにて発見しました。VideoSourceを設定せずプレビューを非表示の状態でフラッシュモードを常にONに設定することで実現しているようです。

// フラッシュを常に発光させる
camera.FlashMode = FlashMode.On;

フラッシュは静止画撮影時に一瞬発光させるものであるため,発光パーツの消耗や消費電力的にフラッシュを付けっぱなしにするのはあまりおススメできませんが,面白いアイディアですね。

静止画撮影を行う

静止画撮影を行うトリガーとしてApplicationBarに下図のように撮影用のメニューアイテムを追加しました。

画像

MainPage.xamlのApplicationBar.MenuItemsにApplicationBarMenuItemを追加しています。追加したメニューアイテムには,静止画撮影のトリガーとなるClickイベントのハンドラを設定しています。

<!-- アプリケーションバー -->
<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" 
        IsMenuEnabled="True" Mode="Minimized">

        <shell:ApplicationBar.MenuItems>
            <shell:ApplicationBarMenuItem 
                x:Name="menuItemTakePicture" 
                Text="Take Picture" 
                Click="menuItemTakePicture_Click" />
        </shell:ApplicationBar.MenuItems>

    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

ここでトリガーとして用意したmenuItemTakePicture_Clickメソッドがコールされた時,静止画撮影を行うように実装してみましょう。

静止画撮影の解像度の設定

Windows Phone OSを搭載するためのハードウェア要件として,5Mピクセル以上のカメラを搭載しなければいけないことになっています。

私の持っているHTC Mozartは最大8Mピクセルまでしか撮影できませんが,IS12Tは13Mピクセルまで撮影することが可能です。機種によって搭載されているカメラセンサーは異なり,当然撮影可能な解像度も違ってきます。

実行中のWindows Phone端末で撮影可能な解像度を得るためには,PhotoCamera.AvailableResolutionsプロパティからSizeの配列を取得します。

// 静止画撮影可能な解像度を取得する
var sizes = camera.AvailableResolutions;
// 撮影可能な解像度のうち一番大きなものを設定
camera.Resolution = sizes.Last();

デバッグ実行中のスクリーンショットを取りました。下図の通り解像度が取得できているのが確認できます。

画像

Windows Phoneエミュレータでの撮影可能な解像度を取得したところです。取得できた解像度は,640×360,640×480(VGA)⁠2592×1944(5M)⁠3264×2448(8M)の4つ。通常Windows Phoneの標準カメラアプリでは存在しない撮影サイズが含まれていることに注目してください。

著者プロフィール

和田健司(わだけんじ)

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/

コメント

コメントの記入