読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでWindows Phone 7 Silverlight ZXing Barcode Scanning Libraryを使ってバーコードを読み込む(Windows Phone OS 7.0)

Windows Phone

id:nagakura_eilが「2011-04-28 - だらだらやるよ。」の記事を書いていました。.NET Compact FrameworkでZXingを使っているのを見て思い出しました。Windows Phone 7でもバーコードの読み込みが簡単に出来ます。

Windows Phone 7アプリでバーコードやQRコードを読ませたいのであれば、オープンソースのZXingをWindows Phone 7向けにラッピングした「Windows Phone 7 Silverlight ZXing Barcode Scanning Library」を使うのが手っ取り早くて楽です。

例えば、こんなQRコードがあります。

Windows Phone 7はカメラプレビューのリアルタイム取り込みが出来ませんから、CameraCaptureTaskを使って画像を撮影して、そのストリームをZXingに渡してバーコードの読み込みを行います。

前述したとおり解像度は最低(QVGA撮影が出来れば良いんだけど……VGAで)に設定して撮影しないと解析に失敗します。おそらく画像が大きすぎると解析に時間が掛かりすぎる or メモリが足りなくなるのが原因と思います。

private void btnCamera_Click(object sender, EventArgs e)
{
    var task = new Microsoft.Phone.Tasks.CameraCaptureTask();
    task.Completed += new EventHandler<Microsoft.Phone.Tasks.PhotoResult>(task_Completed);
    task.Show();
}

void task_Completed(object sender, Microsoft.Phone.Tasks.PhotoResult e)
{
    if (e.TaskResult != Microsoft.Phone.Tasks.TaskResult.OK)
        return;

    // 取り込んだ画像をBitmapImageへセット
    var bitmap = new System.Windows.Media.Imaging.BitmapImage();
    bitmap.SetSource(e.ChosenPhoto);
    
    // QR Code 2D barcodeの解析を行う
    // ほかに設定できるバーコードの種類は、
    //     MultiReader for all 1D barcode types.
    //     Code 128 1D format.
    //     Code 39 1D format.
    //     DataMatrix 2D barcode format.
    //     EAN-13 1D format.
    //     EAN-8 1D format.
    //     ITF (Interleaved Two of Five) 1D format.
    //     PDF417 format.
    //     QR Code 2D barcode format.
    //     UPC-A 1D format.
    //     UPC-E 1D format.
    //     MultiReader for all UPC and EAN types.
    WP7BarcodeManager.ScanMode = com.google.zxing.BarcodeFormat.QR_CODE;
    WP7BarcodeManager.ScanBarcode(bitmap, (res) =>
    {
        if (res.State != CaptureState.Success)
            MessageBox.Show(res.ErrorMessage);
        else
            MessageBox.Show(res.BarcodeText);
    });
}

読み取った結果は、こんな感じになります(画質が悪くて申し訳ない……)。

ライブラリから直接CameraCaptureTaskを起動する事も出来るらしいのですが、うちの環境では上手く動いてくれなかったのでこのような実装になりました。またライブラリ自体もBeta版ですのでそのうち動くようになると思います。

ただ、Windows Phone OS 7.5(Mango)では、バーコードの読み込みが標準APIとして用意されるようなので、このライブラリが活躍するのは今のうちだけかもしれませんね。