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

次に、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

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30