2011-06-08 2 views
0

Я использую порт zxing C# для декодирования штрих-кода QR. Код прост и основан на примере, который я нашел в Интернете (см. Ниже).
Проблема заключается в том, что она всегда выдает исключение «Индекс вне пределов массива».
Мой пример кода случается в VB.NET, но ZXing библиотека реализована в 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

+0

@Inuyasha главной проблемой является библиотека C# zxing. Это ключевые слова, которые должны спровоцировать ответ (и люди, которые ищут этот поиск греха). Я обновил вопрос, чтобы попытаться сделать это ясно. –

+1

Неважно, что написано в библиотеке. Важно, чтобы код * вы * писали. – Amy

ответ

0

не знаю, если это собирается помочь и, но я вставить свой код, если и хотите использовать :

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 
Смежные вопросы