Código QR

Iniciado por arfgh, 22 Abril 2018, 16:41 PM

0 Miembros y 1 Visitante están viendo este tema.

arfgh

si, puedo compilar otros sources. No sé lo que pasa para que no funcione, pero tienen que ser bien raro....

arfgh

#11
amigo, ante la  imposibilidad de hacerlo funcionar, he optado pro usar esta otra dll para codificar texto a QR. Dede archivo  lo he conseguido pero la dll tiene una función llamada 'GetPNGW' o 'GetBitmapW' que no sé bien como usar desde vb6.

La dll se llama 'quricol32.dll', se habla de ella aquí:

https://perevoznyk.wordpress.com/2013/09/11/quricol-2-0-qr-code-generator/

http://delphi32.blogspot.com.es/2011/11/quricol-qr-code-generator-library.html

a ver si me puedes ayudar. Lo que pretendo es obtener el bitmap, no es archivo, y procesarla por medio de GDI+. No sé bien como llamar a esa función y como manejar el resultado.

Estoy intentando con 'GetPNGW' y para empezar no tengo claro como declarar la llamada:


Private Declare Sub GetPngStream _
                Lib "Resources\quricol32.dll" _
                Alias "GetPNGW" ( _
                ByVal Stream As variant, _
                ByVal text As String, _
                ByVal Margin As Integer, _
                ByVal PixelSize As Integer)


concretamente el parámetro Stream...

Serapis

#12
Me he descargado esa otra librería...

Toma la librería "quricol32.dll" y muévela a lacarpeta de tu proyecto... si no, no funcionará.

Te pego el código, necesario para guardarlo... fíjate que yo he usado la función para exportar como BMP, no importa, importa la firma de los parámetros...

Código (vb) [Seleccionar]

Private Enum ErrorCorrectionLevel
   LowQuality = 0
   MediumQuality = 1
   StandardQuality = 2
   HighQuality = 3
End Enum


'Private Declare Sub GuardarImagen Lib "quricol32.dll" Alias "GenerateBMPW" (ByVal file As String, ByVal text As String, ByVal margen As Long, ByVal pixelSize As Long, ByVal nivel As ErrorCorrectionLevel)  

' multilínea para ver mejorcada parámetro.
Private Declare Sub GuardarImagen Lib "quricol32.dll" Alias "GenerateBMPW" ( _
    ByVal file As String, _
    ByVal text As String, _
    ByVal margen As Long, _
    ByVal pixelSize As Long, _
    ByVal nivel As ErrorCorrectionLevel)  


Private Sub Command1_Click()
   Dim ruta As String, ruta2w As String, msg As String
   Dim res As Long
   
   msg = StrConv("Probando la librería Quricol...", vbUnicode) ' <--- Ojo: 4 bytes por carácter.
   ruta = App.Path & "\Qr.bmp"
   ruta2w = StrConv(ruta, vbUnicode)   ' <---- OJO: 4bytes por carácter...
   Call GuardarImagen(ruta2w, msg, 2, 3, HighQuality)

   If (Dir(ruta) <> "") Then
       Set Image1.Picture = LoadPicture(ruta)
   End If
End Sub

Private Sub Form_Load()
   Me.BackColor = vbBlack ' contraste para que destaque...
   Image1.Stretch = True
End Sub




p.d.: Olvidaba decirte, que para probarlo, necesitas un botón y un control image.

arfgh

#13
ya pero como te comenté lo que pretendo usar es obtener el stream, no el archivo.

Private Declare Sub GetPngStream _
                Lib "Resources\quricol32.dll" _
                Alias "GetPNGW"

No obstante muy buen ejemplo.

arfgh

Cita de: arfgh en 30 Abril 2018, 13:59 PM
ya pero como te comenté lo que pretendo usar es obtener el stream, no el archivo.

Private Declare Sub GetPngStream _
                Lib "Resources\quricol32.dll" _
                Alias "GetPNGW"

esta "quricol32.dll" si que funciona, no como la dll anterior, no obstante esta dll solamente codifica, no decodifica imágenes con código QR...

No obstante muy buen ejemplo.

Serapis

#15
Perdona... no me di cuenta de tu mensaje hasta hoy que respondía a otro usuario...

El caso, es que falla por varias cuestiones, la primera es que en Delphi, no tienen NPI de lo que es un variant, en segundo lugar, porque la firma de la API es incorrecta...

Te pongo todo el código al caso (incluído el previo)... no te he puesto el tratamiento del png recibido, toda vez que tu señalas que quieres operarlo después con GDI+

El proyecto, asumiendo el código previo anterior aún válido, exige un control image y dos controles de botón. El botón 1 para obtener un fichero bmp que luego cargamos en el control image. El botón 2 para obtener el stream del png (los bytes en memoria, tal cual si hubiéramos pedido un fichero png, y luego leído de disco (obtener el stream es más rápido desde luego, lectura y escritura a y desde disco siempre es más lento que copiar a y desde memoria)).
Código (vb) [Seleccionar]

' Declaraciones

' Nivel de corrección para reconocer posibles fallos. A más calidad, más capacidad de recuperación, pero exige más carga de trabajo, etc...
Private Enum ErrorCorrectionLevel
    LowQuality = 0
    MediumQuality = 1
    StandardQuality = 2
    HighQuality = 3
End Enum

' para copiar datos de memoria de un sitio a otro..
Private Declare Sub CMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

' API, para obtener el codigo-QR en un fichero bmp.
Private Declare Sub GuardarImagen Lib "quricol32.dll" Alias "GenerateBMPW" (ByVal file As String, ByVal text As String, ByVal Margen As Long, ByVal PixelSize As Long, ByVal nivel As ErrorCorrectionLevel)
' API, para obtener el stream en formato png.
Private Declare Sub GetPngStream Lib "quricol32.dll" Alias "GetPNGW" (ByVal text As String, ByVal Margen As Integer, ByVal PixelSize As Integer, ByVal nivel As ErrorCorrectionLevel, ByRef bufSize As Long, ByRef ptrBits As Long)


Código (vb) [Seleccionar]

' Código del botón, para obtener una imagen en formato BMP (luego la cargamos).
Private Sub Command1_Click()
    Dim ruta As String, ruta2w As String, msg As String
    Dim res As Long
   
    msg = StrConv("Hola que tal estas", vbUnicode)
    ruta = App.Path & "\Qr.bmp"
    ruta2w = StrConv(ruta, vbUnicode)
    Call GuardarImagen(ruta2w, msg, 2, 3, HighQuality)

    If (Dir(ruta) <> "") Then
        Set Image1.Picture = LoadPicture(ruta)
    End If
End Sub

' carga del formulario...
Private Sub Form_Load()
    Me.BackColor = vbBlack ' contraste para que destaque...
    Image1.Stretch = True
End Sub


Código (vb) [Seleccionar]

Private Sub Command2_Click()
    Dim msg As String
    Dim res As Long, k As Long, ptr As Long
    Dim stm() As Byte
   
    msg = StrConv("Hola que tal estas", vbUnicode)
   
    Call GetPngStream(msg, 2, 3, HighQuality, k, ptr)
   
    If (k < 1) Then
        MsgBox "No parece haberse recibido ninguna imagen..."
    Else
        ReDim stm(0 To k - 1)
        Call CMem(ByVal VarPtr(stm(0)), ByVal ptr, k)
       
        ' tu código restante iría aquí:
        ' yo sólo imprimo el valor de los bytes... para verificar que es correcto.
        For j = 0 To k - 1
            Debug.Print stm(j)
        Next
       
        ' ...
    End If
End Sub


Y en efecto, el volcado me arroja:
137
80
78
71
13
10
26
10
0
0
0
13
73
72
68
82
...
que son los bytes correspondientes a la cabecera de un png: "%PNG        IHDR"...

..y por último sólo recordarte que al final estamos usando la librería de Delphi Quricol32.dll, no el wrapper de C# Quricol.Barcode.dll.