22 de junio de 2011

Decodificar QR usando ZBar

Anteriormente, publiqué un artículo para crear un código QR usando la Api de Google.

Ahora intento ejemplificar la Lectura de un QR usando la aplicación ZBar que es Open Source, y contiene unos ejecutables dentro de la carpeta BIN que en particular utilizo para este ejemplo el zbarimg.exe

Para este ejemplo, se supone que previamente se tiene "copiada" en portapapeles el QR a decodificar, usando GDI+ lo almaceno en un archivo temporal para decodificarlo.

El código es el siguiente:
SET DEFAULT TO SYS(5)+ADDBS(SYS(2003))

* --- Creamos una imagen desde el portapapeles para validar el QR ---
* --- Código de Luis María Guayan, Gracias por tus aportaciones. ---
Do System.App
loBmp = _Screen.System.Drawing.Bitmap.FromClipboard()
IF ISNULL(loBmp)
  MESSAGEBOX("Debe copiar antes la imagen del CBB al portapapeles!!",16,"Lector QR")
  RETURN
ENDIF 
uidImagen = ADDBS(SYS(2023)) + SYS(2015)+".png"
loBmp.Save(uidImagen, _Screen.System.Drawing.Imaging.ImageFormat.Png)

* --- Creamos el comando de DOS para ejecutar ZBar excelente herramienta open source ---
* --- http://zbar.sourceforge.net/  ---
lpComando = SYS(5)+ADDBS(SYS(2003))+"ZBar\zbarimg.exe -D "+uidImagen+ " > "+uidImagen+".txt"
TEXT TO xBAT NOSHOW ADDITIVE TEXTMERGE PRETEXT 7
echo off
<<lpComando>>
ENDTEXT
uidBat = ADDBS(SYS(2023)) + SYS(2015) + [.bat]
STRTOFILE(xBAT,uidBat)
zCommando = uidBat
Ejecuta(zCommando, 0)
BorraArchivo(uidBat)

* --- Ahora cargamos el contenido del QR ---
cContenidoQR = "" 
IF FILE(uidImagen+".txt")
  cContenidoQR = FILETOSTR(uidImagen+".txt")
ENDIF 
BorraArchivo(uidImagen)
BorraArchivo(uidImagen+".txt")

* --- Lo mostramos a pantalla ---
Messagebox(IIF(EMPTY(cContenidoQR),"ERROR: No se pudo leer el QR",cContenidoQR),64,"Lector QR")

*---------------------------------------------------
FUNCTION BorraArchivo(pFile)
*---------------------------------------------------
* Esta funcion elimina el archivo indicado como parametro
* si es que existe en Disco
*---------------------------------------------------
  IF FILE(pFile)
    DELETE FILE (pFile)
  ENDIF 
ENDFUNC 
*---------------------------------------------------

*---------------------------------------------------
FUNCTION Ejecuta(cComando, iStatus)
*---------------------------------------------------
*!* Esta funcion ejecuta un comando de DOS indicado
*!* como primer parámetro, el segundo es el estilo
*!* de la ventana a utilizar, ver el sig. listado
*!* entEstiloVentana Descripción
*!* 0 Oculta la ventana y activa otra.
*!* 1 Activa y muestra una ventana. Si la ventana está minimizada o maximizada, el sistema la restaura con su posición y tamaño originales. 
*!*             Una aplicación debe especificar este indicador cuando muestre la ventana por primera vez.
*!* 2 Activa la ventana y la muestra minimizada.
*!* 3 Activa la ventana y la muestra maximizada.
*!* 4 Muestra una ventana con su tamaño y posición más recientes. La ventana activa permanece activa.
*!* 5 Activa la ventana y la muestra con su tamaño y posición actuales.
*!* 6 Minimiza la ventana especificada y activa la siguiente ventana de mayor nivel en orden Z.
*!* 7 Muestra la ventana minimizada. La ventana activa permanece activa.
*!* 8 Muestra la ventana en su estado actual. La ventana activa permanece activa.
*!* 9 Activa y muestra la ventana. Si la ventana está minimizada o maximizada, el sistema la restaura con su posición y tamaño originales. 
*!*             Una aplicación debe especificar este indicador cuando se restaure una ventana minimizada.
*!* 10 Establece el estado de presentación a partir del estado del programa que inició la aplicación.
*----------------------------------------------------
  TRY 
    oShell = createobject("WScript.Shell") 
    oShell.Run(cComando,iStatus,.T.) 
  CATCH TO xEcepcion
    lsErrorEcepcion = "No se pudo ejecutar: "+cComando+ " RS:"+TRANSFORM(xEcepcion.ErrorNo) + CHR(13)+CHR(10)+  "Mensaje: " + xEcepcion.Message
    Messagebox(lsErrorEcepcion,16,"Lector QR")
  FINALLY
    *  
  ENDTRY   
ENDFUNC
*----------------------------------------------------

Pueden descargar el ejemplo completo, con librerias y ejecutables adicionales desde aqui

Baltazar Moreno

No hay comentarios. :

Publicar un comentario