viernes, 27 de abril de 2012

Generar QRBarcode

Hoy nos toca hablar de como podemos crear una aplicación que genere QR Barcode, para ello utilizaremos una dll que se encuentra libre, la cual se llama ThoughtWorks.QRCode.dll.

Por mi parte yo me he basado en este código que está muy bueno para generar QR Code:
http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library

http://www.codeproject.com/Articles/258779/Just-launched-new-open-source-project-QrCode-Net-a

En principio explicaré lo que deseo hacer, crearemos un formulario que debe capturar el texto que se le pasará para ser transformado a QR Code, para ello deben seguir los siguientes pasos:

NOTA: En principio para el ejemplo que publicaré solo necesitan buscar la dll y luego hacer lo que les indico a continuación (La dll la pueden encontrar en el código de ejemplo que viene en la URL de arriba).

- Crear un proyecto de Windows, luego agregar un formulario (yo lo he llamado QRBarcode a los dos).

- Agregar un PictureBox, al cual llamaremos pbxImage. Si no lo encuentran en el cuadro e herramientas, deben agregarlo del siguiente espacio de nombre (System.Windows.Forms.PictureBox).

Con esto ya estamos listos para crear una imagen con QR Code utilizando la dll ThoughtWorks.QRCode.

Lo primero de todo es agregar una referencia a la DLL
ThoughtWorks.QRCode.dll y luego instanciar los espacios de nombre que utilizaremos:

Imports ThoughtWorks.QRCode
Imports ThoughtWorks.QRCode.Codec
Imports ThoughtWorks.QRCode.Codec.Data

A continuación, dentro del espacio de nombre la de la clase QRBarcode agregaremos las siguientes líneas de código:


Dim mQRString As String = ""
Dim mQRUtf As Boolean = True


Public Property QRString() As String
Get
Return Me.mQRString
End Get
Set(ByVal value As String)
Me.mQRString = value
End Set
End Property

Public Property QRUtf() As Boolean
Get
Return Me.mQRUtf
End Get
Set(ByVal value As Boolean)
Me.mQRUtf = value
End Set
End Property


NOTA: Como sabemos nuestro formulario será un PopUp que solo mostrará la imagen resultante, por lo cual debemos pasarle en principio estos dos parámetros para generar la imagen.

- En el método que atiende el evento Load del formulario escribiremos las siguientes líneas de código


Private Sub QRBarcode_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try

If QRString <> "" Then

Dim generarCodigoQR As QRCodeEncoder = New QRCodeEncoder
generarCodigoQR.QRCodeEncodeMode = Codec.QRCodeEncoder.ENCODE_MODE.BYTE
generarCodigoQR.QRCodeScale = Int32.Parse(4)

'pequeña (7%)
'generarCodigoQR.QRCodeErrorCorrect = Codec.QRCodeEncoder.ERROR_CORRECTION.L

'Medium (15%)
'generarCodigoQR.QRCodeErrorCorrect = Codec.QRCodeEncoder.ERROR_CORRECTION.M

'grande(25%)
'generarCodigoQR.QRCodeErrorCorrect = Codec.QRCodeEncoder.ERROR_CORRECTION.Q

'muy grande (35%)
generarCodigoQR.QRCodeErrorCorrect = Codec.QRCodeEncoder.ERROR_CORRECTION.H

'0 definición automática de porte
generarCodigoQR.QRCodeVersion = 0

generarCodigoQR.QRCodeBackgroundColor = _
System.Drawing.Color.FromArgb(Color.FromArgb(255, 255, 255, 255).ToArgb)

generarCodigoQR.QRCodeForegroundColor = _
System.Drawing.Color.FromArgb(Color.FromArgb(255, 0, 0, 0).ToArgb)


Try
Dim bmImage As System.Drawing.Bitmap
If Not QRUtf Then
bmImage = generarCodigoQR.Encode(Me.QRString)
Else
'UTF-8
bmImage = generarCodigoQR.Encode(Me.QRString)
End If

Me.Width = bmImage.Width + 40
Me.Height = bmImage.Height + 40

Me.pbxImage.Width = bmImage.Width
Me.pbxImage.Height = bmImage.Height

Me.pbxImage.Image = bmImage

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly)
End Try

End If

Catch ex As Exception
MessageBox.Schow(ex.Message)
End Try
End Sub


A continuación desde el formulario que pasará los datos debemos llamar a nuestro formulario QRCode, de la siguiente forma:

Dim frm as new QRCode
frm.
QRString = "Texto a codificar"
frm.QRUtf = True.
frm.ShowDialog()

Con esto amigos, hemos creado nuestro primer QRCode, sin necesidad de comprar una dll y sin necesidad de entender los complicados ejemplos que generalmente encontramos.

Si desean hacer más cosas, les recomiendo seguir el ejemplo del link que les he entregado al principio.

IMPORTANTE: Pueden tener problemas con la dll cuando trabajan con Strongname, ya que ésta no viene firmada con un nombre seguro. Si tienen este problema, les recomiendo crear un proyecto externo, generar un archivo .exe y llamar éste. Al formulario, agregarle los objetos con los parámetros que necesitan y al principio del código del método que atiende el evento load, buscar estos objetos con la información.

Mejor cuelgo un ejemplo para los que somos más lentos:

1 - POR EL LADO DE LA LLAMADA

Primero deben llamar el ensamblado

Dim dir_path As String = My.Application.Info.DirectoryPath
Dim frm As System.Reflection.Assembly
frm = System.Reflection.Assembly.LoadFrom(dir_path + "\QRBarcode.exe")

Una vez instanciado el ensamblado, debemos referenciar el formulario, debemos usar el espacio de nombre del proyecto y de la clase, para nuestro caso:

Dim frmType As Type = frmExterno.GetType("QRBarcode.QRBarcode")
Dim frmObj As Object = System.Activator.CreateInstance(frmType)

frm = CType(FormObj, System.Windows.Forms.Form)

ya con esto tenemos referenciado el formulario.

AQUÍ VIENE EL TRUQUITO.

Como no podemos ver las propiedades del formulario, podemos hacer lo siguiente:
crearemos 2 Label con la información que deseamos pasar y los agregaremos por código al formulario con la propiedad visible en False:

Dim lbl1 As New Label()
lbl1.Name = "name"
lbl1.Text = "Texto a codificar"
lbl1.Visible = False

Dim lbl2 As New Label()
lbl2.Name = "utf"
lbl2.Text = True
lbl2.Visible = False

frm.Controls.Add(lbl1)
frm.Controls.Add(lbl2)

frm.ShowDialog()

2 -POR EL LADO DEL FORMULARIO

Al principio del método que atiende el evento Load del formulario QRCode, debemos agregar las siguientes líneas de código:

For Each c As Control In Me.Controls

If TypeOf c Is Label Then
If c.Name = "name" Then Me.QRString = (c.Text).Trim()
If c.Name = "utf" Then Me.QRUtf = Boolean.Parse(c.Text)
End If
Next

Bueno amigos, a que no sabían que podían hacer esto he!.

Como dijo Einstein "No tengo talentos especiales pero sí soy profundamente curioso".

No hay comentarios: