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

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

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

Windows Phone 7 Silverlight ZXing Barcode Scanning Libraryを使用する

Google社が公開しているオープンソースのうちのひとつに,ZXingと言われるバーコードのエンコード(生成)とデコード(解析)を行うライブラリがあります。ZXingの名前は,シマウマを表すZebraと横断歩道を意味するCrossingを合わせた⁠Zebra Crossing⁠という語に由来するようです。

このZXingライブラリは,iPhone向けやAndroid向け等たくさんの派生プロジェクトが存在しており,表題の「Windows Phone 7 Silverlight ZXing Barcode Scanning Library」はWindows Phone 7のSilverlightアプリケーション向けライブラリのプロジェクトです。

2011年10月現在,このWindows Phone 7向けのライブラリがサポートしているバーコードのフォーマットは,以下の8つとなっています。

  • UPC-A and UPC-E
  • EAN-8 and EAN-13
  • Code 39
  • Code 128
  • QR Code
  • ITF
  • Data Matrix (Not tested)
  • PDF417 (Not tested)

バーコードを含んだ写真から解析を行うというライブラリの性格上,カメラ機能と相性がよく,標準カメラアプリを使って撮影を行うCameraCaptureTaskクラスや,既に撮影済みの写真を選択するPhotoChooserTaskクラスや,カメラデバイスからのプレビューフレームを受け取るPhotoCameraクラスと組み合わせて使用すると,有用なアプリケーションを開発することができそうです。

導入

導入はとても簡単で,Codeplaxからダウンロードして,dllアセンブリを参照するだけです。http://silverlightzxing.codeplex.com/にアクセスしていただいて,右端の「Download」を選択します。

画像

既にビルド済みのdllアセンブリが含まれていますので,ダウンロードしたzipファイルを任意のフォルダへ解凍して,以下のファイルを自分のプロジェクトへ組み込んでしまいましょう。

  • Silverlight_ZXing_Core.dll
  • WP7_Barcode_Library.dll

画像

以上で,プロジェクトへのZXingライブラリの組み込みは完了です。

次は画面を作っていきましょう。

画像

前述した通り,PhotoCamera.GetPreviewBufferYメソッドから取り込んだ映像を矩形PreviewRectangleに表示しつつ,取り込んだ映像をリアルタイムに解析し,バーコードの認識ができればリストボックスBarcodeListBoxへ解析結果を追加していきます。xamlを示します。

<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>
    <!-- バーコード解析完了後に追加するリストボックス -->
    <ListBox Name="BarcodeListBox" FontSize="29.333" />
</Grid>

先ほどご紹介しましたリアルタイムにエフェクト処理を行うのと同様に,まずカメラの初期化処理が完了したらタイマーを開始し,満了後にreadTimer_Tickメソッドが呼び出されるように設定します。

au IS12TとHTC 7 Mozartの実機で動作確認を行いましたが,プレビュー表示程度ですと10fps(1秒間に10回)でプレビューフレームを解析しても滞りなく処理されていました。

// プレビューフレームの解析を行うタイマー
System.Windows.Threading.DispatcherTimer readTimer = 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
        };

        // 100ミリ秒毎に満了する様にタイマーを開始
        readTimer = new System.Windows.Threading.DispatcherTimer();
        readTimer.Tick += new EventHandler(readTimer_Tick);
        readTimer.Interval = TimeSpan.FromMilliseconds(100);
        readTimer.Start();
    });
}

著者プロフィール

和田健司(わだけんじ)

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/