バーコードをスキャンする
2012年2月10日(金)
次に、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
「バーコードをスキャンする」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。