2011-06-08 144 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