2011-06-08 44 views
0

我正在使用zxing C#端口來解碼QR條碼。 代碼很簡單,基於我在網上找到的一個例子(見下文)。
問題是,它總是拋出一個「索引超出數組邊界」的例外。
我的代碼示例恰巧在VB.NET,但斑馬線庫是用C#實現ZXING端口無法解碼qrcode

Dim re As qrcode.QRCodeReader 
re = New qrcode.QRCodeReader() 

Dim Img As New Bitmap("<image file path here>") 

Dim res As com.google.zxing.Result 

Dim bufimg As com.google.zxing.client.j2se.BufferedImageMonochromeBitmapSource 
bufimg = New client.j2se.BufferedImageMonochromeBitmapSource(Img, False) 
res = re.decode(bufimg) 

Dim ret As String = res.getText() 

我見過多人抱怨在不同的論壇同樣的問題,但沒有發現任何建議的解決方案。

UPDATE如果有人不同良好QR閱讀器,可以方便地與.NET應用程序集成的人都知道,請推薦

+1

你說C#兩次,但我看到VB代碼。你應該根據你寫的代碼來標記你的問題,而不是你正在使用的庫。 – Amy 2011-06-08 15:42:27

+0

@Inuyasha主要問題是C#zxing庫。這些是應該觸發響應的關鍵字(以及人們發現這種正向搜索)。我更新了這個問題,試圖說清楚。 – 2011-06-08 17:18:05

+1

圖書館的書寫內容並不重要。重要的是您正在編寫的代碼。 – Amy 2011-06-08 19:27:27

回答

0

不知道這是否會幫助ü,但我貼我的代碼,如果u想使用:

Imports Zxing = com.google.zxing 
Imports System.Drawing 

Public Class Decodificador 
    'Para leer todo tipo de codigos soportados por el proyecto zxing 
    Private Reader As New Zxing.MultiFormatReader 
    'Private Reader As New Zxing.qrcode.QRCodeReader 
    Private Result As Zxing.Result 
    Private Imagen As Bitmap 
    Private Bitm As Zxing.BinaryBitmap 
    Private HBin As Zxing.common.HybridBinarizer 
    Private Lumin As RGBLuminanceSource 
    'El orden para poder funcionar es: 
    'DetectarCodigoEnImagen (Obligatorio) >> PintarLocalizacion [opcional] >> DecodificarImagen (Obligatorio para sacar info). 
    ''' <summary> 
    ''' Devuelve True si ha localizado un QRCODE 
    ''' </summary> 
    ''' <param name="img"></param> 
    ''' <returns></returns> 
    ''' <remarks></remarks> 
    Public Function DetectarCodigoEnImagen(ByRef img As Image) As Boolean 
     Try 
      Imagen = New Bitmap(img) 
      'Creamos un Mapa binario con la imagen y su tamaño 
      Lumin = New RGBLuminanceSource(Imagen, Imagen.Width, Imagen.Height) 
      HBin = New Zxing.common.HybridBinarizer(Lumin) 
      Bitm = New Zxing.BinaryBitmap(HBin) 
      'Decodificamos el mapa binario y guardamos todos los datos en Result 
      Result = Reader.decode(Bitm) 
      'Si ha encontrado un QRCode provocará una excepción y devolverá False 
      'Si hay un QRCode, devolverá True 
      Return True 
     Catch ex As Exception 
      Return False 
     End Try 
    End Function 
    ''' <summary> 
    ''' Dibuja cuadros rojos y amarillos en la localización del Codigo QR, ralentiza mucho el sistema. 
    ''' Debe haberse detectado un codigo en la imagen para poder pintar. 
    ''' Devuelve la imagen con el Codigo QR y la localización pintada 
    ''' </summary> 
    ''' <param name="img"></param> 
    ''' <remarks></remarks> 
    Public Function PintarLocalizacionQrCode(ByRef img As Image) As Image 
     Try 
      'Archivamos en una matriz todos los puntos de localización del QRcode 
      Dim Puntos() As Zxing.ResultPoint = Result.ResultPoints 
      'Creamos Graficos desde la imagen y poder pintar posteriormente 
      Dim gr As Graphics = Graphics.FromImage(Imagen) 
      'Dim gr As Graphics = Graphics.FromImage(Imagen) 
      'Declaramos el tamaño del pincel para pintar y pintar2 
      Dim TamPincel As Integer = 4 
      Dim Pintar As New Pen(Color.Yellow, TamPincel) 
      Dim Pintar2 As New Pen(Color.Red, TamPincel) 
      'Declaramos una variable del mismo tipo que el arreglo Puntos() para poder navera por ella 
      Dim PuntoAuxiliar As com.google.zxing.ResultPoint 

      'Por cada punto en puntos() dibujamos 2 rectangulos en los indicadores de posición del QRCode 
      For Each PuntoAuxiliar In Puntos 
       gr.DrawRectangle(Pintar, New Rectangle(PuntoAuxiliar.X - 10, PuntoAuxiliar.Y - 10, 20, 20)) 
       gr.DrawRectangle(Pintar2, New Rectangle(PuntoAuxiliar.X - 13, PuntoAuxiliar.Y - 13, 26, 26)) 
      Next 
      'Liberamos la memoria 
      gr.Dispose() 
      Return Imagen 
     Catch ex As Exception 
      Throw ex 
     End Try 
    End Function 
End Class