🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3511閲覧

.net ZXingを用いたQRコード変換

kentoyamada

総合スコア8

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/12/31 02:47

前提・実現したいこと

VB.net初心者です。
PictureBoxコントロールに、内臓カメラで取得した画像を常時表示し、その画像(撮影しているQRコード)をボタンクリック時に文字列変換し、テキスト表示するアプリを作っています。

ソースコード

言語はVB.netです。
ソースコードは以下になります。
ボタンを押してから、問題となっている「QRコード⇒文字列変換」の部分を載せておきます。

'testボタン押下時 Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click '表示中のImageをbitmapとして取得 Dim source As Bitmap = New Bitmap(Me.PictureBox1.Image) 'QrCodeReader Dim q_reader As ZXing.QrCode.QRCodeReader = New ZXing.QrCode.QRCodeReader() 'Imageオブジェクトをバイト配列に変換 Dim b_data As Byte() = ImageToByteArray(source) Dim l_data As RGBLuminanceSource = New RGBLuminanceSource(b_data, source.Width, source.Height) Dim binarizer As Common.HybridBinarizer = New Common.HybridBinarizer(l_data) Dim source2 As BinaryBitmap = New BinaryBitmap(binarizer) 'QRCodeReader変換 Dim q_result As ZXing.Result = q_reader.decode(source2) If (q_result IsNot Nothing) Then Dim q_string As String = q_result.ToString load_seizo_txt.Text = q_string.Substring(0, 5) load_seiko_txt.Text = q_string.Substring(6, 11) load_lot_txt.Text = q_string.Substring(12, 17) End If End Sub 'Imageオブジェクトをバイト配列に変換 Public Shared Function ImageToByteArray(ByVal img As Image) As Byte() Dim b As Byte() = CType(imgconv.ConvertTo(img, GetType(Byte())), Byte()) Return b End Function

※念のため、インポートしている情報も載せておきます。
Imports ZXing
Imports ZXing.BinaryBitmap
Imports ZXing.Binarizer
Imports ZXing.LuminanceSource
Imports ZXing.Result
Imports ZXing.QrCode
Imports ZXing.QrCode.QRCodeReader

Imports UnityEngine
Imports UnityEngine.Color
Imports UnityEngine.Color32

発生している問題・エラーメッセージ

問題は以下の2つです。
1.変換処理でエラーが発生し、プロセスが死ぬ?
⇒Dim l_data As RGBLuminanceSource = New RGBLuminanceSource(b_data, source.Width, source.Height)
この処理で毎回エラーが発生します。
※エラーの画像は添付しています。「インデックスの範囲が境界外です。」といった旨です。イメージ説明

2.上記1で該当処理が上手くいったとしても、QRコードから文字列への変換ができない。

試したこと

ちなみに撮影中のQR画像ではなく、ネットに転がっていたきれいなQRコードの画像を同様に変換処理してもエラーが発生します。
なので画像ではなく、ZXsingによる変換処理中の問題なのかと考えています。

以上です。
乱文で申し訳ございませんが、どなたかご教授お願い致します。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

RGBLuminanceSource に渡す引数が間違っています。RGBLuminanceSource のそのオーバーロードに渡す引数の 1 つ目は 24 ビット RGB 形式の画像データと決まっているので、ImageConverter クラスを使用して変換したバイト配列を渡すことはできません。Bitmap クラス前提となりますが、ImageToByteArray の実装は以下のようになります。

VB

1 Public Shared Function ImageToByteArray(ByVal img As Bitmap) As Byte() 2 Dim rect As Rectangle = New Rectangle(0, 0, img.Width, img.Height) 3 Dim data As BitmapData = img.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb) 4 Try 5 Dim bytes(data.Stride * data.Height - 1) As Byte 6 Marshal.Copy(data.Scan0, bytes, 0, data.Stride * data.Height) 7 Return bytes 8 Finally 9 img.UnlockBits(data) 10 End Try 11 End Function

別途、以下を Imports しておいてください。

VB

1Imports System.Drawing.Imaging 2Imports System.Runtime.InteropServices

投稿2020/01/01 17:45

atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentoyamada

2020/01/02 04:56

上手く動作し、感動しました。 ありがとうございます。今後も勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問