ロジックコードを記述する
次に、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
- この記事のキーワード