バーコードをスキャンする

2012年2月10日(金)
PROJECT KySS

次に、MainPage.xamlを展開して表示されるMainPage.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainPage.xaml.vb)

Option Strict On
Imports System.IO

Silverlightイメージングに関連する型の含まれるSystem.Windows.Media.Imaging名前空間をインポートします。
Imports System.Windows.Media.Imaging

PhotoCameraを使用するのに必要なクラスの含まれる、Microsoft.Devices名前空間をインポートします。
Imports Microsoft.Devices

Imports Microsoft.Phone.Controls

BarCodeをスキャンするのに必要なクラスの含まれる、WP7_Barcode_Library名前空間をインポートします。
Imports WP7_Barcode_Library

Partial Public Class MainPage
  Inherits PhoneApplicationPage

  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub
PhotoCameraクラス型のメンバ変数myCameraを宣言します。
  Dim myCamera As PhotoCamera

ページが読み込まれた時の処理

AddHandlerステートメントで、実機のシャッターボタンが長押しされた時に発生する、ShutterKeyHalfPressedイベントに、CameraButtons_ShutterKeyHalfPressedイベントハンドラを追加します。
  Private Sub MainPage_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    AddHandler CameraButtons.ShutterKeyHalfPressed, AddressOf CameraButtons_ShutterKeyHalfPressed
  End Sub

ページがアクティブになった時の処理

カメラの指定されたタイプでPhotoCameraクラスの新しいインスタンスを初期化します。CameraType.Primaryは、カメラがデバイスの背面に位置していることを意味します。VideoBrushのSetSourceメソッドで、PhotoCameraのキャプチャソースを使用して、VideoBrushのソースを設定します。
  Protected Overrides Sub OnNavigatedTo(e As System.Windows.Navigation.NavigationEventArgs)
    myCamera = New PhotoCamera(CameraType.Primary)
    myVideoBrush.SetSource(myCamera)
    MyBase.OnNavigatedTo(e)
  End Sub

実機のシャッターボタンが長押しされた時に発生する処理

Rectangleコントロールが表示状態にある場合は、Focusメソッドで、カメラのオートフォーカスの動作を開始します。
  Private Sub CameraButtons_ShutterKeyHalfPressed(sender As Object, e As EventArgs)
    If Rectangle1.Visibility = Windows.Visibility.Visible Then myCamera.Focus()
  End Sub

[Shutter] ボタンがタップされた時の処理

画像の現在の解像度の、Widthの値を変数xに格納します。同様に、Heightの値を変数yに格納します。PhotoCameraオブジェクトのPreviewBufferを保持している、整数の配列を作成します。画像の現在の解像度のWidthとHeightで初期化された、WriteableBitmapの新しいインスタンス、wbオブジェクトを生成します。PhotoCamera.GetPreviewBufferArgb32メソッドで、さらなる操作のためのバッファに、現在のファインダーのARGBのフレームをコピーします。その後、配列が、wbと呼ばれるWriteableBitmapオブジェクトのピクセルにコピーされます。
新しいMemoryStreamのインスタンスmsオブジェクトを作成します。新しいBitmapImageのインスタンス、bmpオブジェクトを作成します。WriteableBitmapクラスのSaveJpegメソッドを使用して、キャプチャされた画像は、BitmapImageを作成するために使用されているMemoryStreamオブジェクトとして書き出されます。BitmapImageのSetSourceメソッドにMemporyStreamクラスのオブジェクトmsを指定します。
スキャンが完了した時に呼び出されるメソッド(BarcodeResults_Finished)と共に、WP7BarcodeManager.ScanBarcodeメソッドのパラメータが呼び出されます。
PhotoCameraクラスのCaptureImageメソッドで、ファインダー内に表示されている画像の、フル解像度のキャプチャを開始します。Try~Catch~ End Tryで例外処理を行っています。
  Private Sub shutterButton_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles shutterButton.Click
    Dim x As Integer = 0
    Dim y As Integer = 0
 
    x = CInt(myCamera.PreviewResolution.Width)
    y = CInt(myCamera.PreviewResolution.Height)
    Dim ARGBcam As Integer() = New Integer(x * y - 1) {}
 
    Dim wb As WriteableBitmap = New WriteableBitmap(x, y)
    myCamera.GetPreviewBufferArgb32(ARGBcam)
    ARGBcam.CopyTo(wb.Pixels, 0)
 
    Dim ms As New MemoryStream
    Dim bmp As New BitmapImage
 
    wb.SaveJpeg(ms, x, y, 0, 100)
    bmp.SetSource(ms)
    Try
      WP7BarcodeManager.ScanBarcode(bmp, New Action(Of BarcodeCaptureResult)(AddressOf BarcodeResults_Finished))
      myCamera.CaptureImage()
    Catch ex As Exception
      MessageBox.Show("読み取りエラー")
      Exit Sub
    End Try
  End Sub

スキャンが完了した時の処理

スキャンが成功した時は、Rectangle1コントロールを非表示にし、StackPanelとその中のコントロールを表示します。Image1のSourceプロパティに、WP7BarcodeManager.LastCaptureResults.BarcodeImageプロパティで取得したバーコードの画像を指定します。WP7BarcodeManager.LastCaptureResultsプロパティは、スレッド間のアクセスのための、最後のバーコードのキャプチャ結果を格納します。numberTextBlockにスキャンしたバーコードのテキストを表示します。スキャンが成功しなかった場合は、メッセージを表示します。
  Private Sub BarcodeResults_Finished(BCResult As BarcodeCaptureResult)
    If BCResult.State = CaptureState.Success Then
      Rectangle1.Visibility = Windows.Visibility.Collapsed
      barStackPanel.Visibility = Windows.Visibility.Visible
      Image1.Source = WP7BarcodeManager.LastCaptureResults.BarcodeImage
      numbertextBlock.Text = BCResult.BarcodeText
    Else
      MessageBox.Show("やり直してください。")
      Exit Sub
    End If
  End Sub

リフレッシュアイコンがクリックされた時の処理。

Rectangleコントロールを表示状態にします。StackPanelとその子要素、ImageとTextBlockコントロールを非表示にします。TextBlockコントロールの内容を消去します。再度、矩形内に被写体が表示されます。
  Private Sub Page_Refresh(sender As Object, e As EventArgs)
    Rectangle1.Visibility = Windows.Visibility.Visible
    barStackPanel.Visibility = Windows.Visibility.Collapsed
    numbertextBlock.Text = String.Empty
  End Sub
End Class
  • 「バーコードをスキャンする」サンプルプログラム

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています