Dalla collaborazione di milio e vuott......
(http://www.antoniodecurtis.org/divisi_a_berlino10.jpg)
si è ricavato un applicativo per poter conoscere il testo del QR Code (http://it.m.wikipedia.org/wiki/Codice_QR).
Per la realizzazione di questo codice si sono utilizzate le funzioni delle librerie dinamiche di ''OpenCV (http://opencv.org/)'' e di ''QRdecoder (http://sourcecodebrowser.com/libdecodeqr/0.9.3/index.html)".
Ne presentiamo il resoconto di seguito:
Public Struct QrCodeHeader
model As Integer
version As Integer
level As Integer
charactor_size As Integer
byte_size As Integer
End Struct
Private Const CV_LOAD_IMAGE_UNCHANGED As Short = -1
Private Const DEFAULT_ADAPTIVE_TH_SIZE As Byte = 25
Private Const DEFAULT_ADAPTIVE_TH_DELTA As Byte = 10
Library "libopencv_highgui:2.4.0"
' IplImage* cvLoadImage( const char* filename, int flags )
Private Extern cvLoadImage(filename As String, flagLIC As Integer) As Pointer
Library "libopencv_core:2.4.0"
' void cvReleaseImage(IplImage * image)
Private Extern cvReleaseImage(img As Pointer)
Library "libdecodeqr:0.9.3"
' QrDecoderHandle qr_decoder_open ()
Private Extern qr_decoder_open() As Pointer
' short qr_decoder_decode_image (QrDecoderHandle decoder, IplImage *src, int adaptive_th_size, int adaptive_th_delta)
Private Extern qr_decoder_decode_image(decoderP As Pointer, srcP As Pointer, adaptive_th_size As Integer, adaptive_th_delta As Integer) As Short
' int qr_decoder_get_header (QrDecoderHandle decoder, QrCodeHeader *header)
Private Extern qr_decoder_get_header(decoderP As Pointer, header As Pointer) As Integer
' int qr_decoder_get_body (QrDecoderHandle decoder, unsigned char *buf, int buf_size)
Private Extern qr_decoder_get_body(decoderP As Pointer, buf As Pointer, buf_size As Integer) As Integer
' void qr_decoder_close (QrDecoderHandle decoder)
Private Extern qr_decoder_close(decoderP As Pointer)
Public Sub Button1_Click()
Dim header, immago, decoder, buf As Pointer
Dim qdh As QrCodeHeader
header = Alloc(SizeOf(gb.Byte), 24)
' Viene caricata l'immagine del "QR Code":
immago = cvLoadImage("/percorso/della/immagine/del/Qr Code", CV_LOAD_IMAGE_UNCHANGED)
If immago == 0 Then Error.Raise("Errore !")
' Viene inizializzata la libreria "decoderqr":
decoder = qr_decoder_open()
If decoder == 0 Then Error.Raise("Errore !")
' Effettua la decodifica utilizzando parametri di default:
qr_decoder_decode_image(decoder, immago, DEFAULT_ADAPTIVE_TH_SIZE, DEFAULT_ADAPTIVE_TH_DELTA)
If qr_decoder_get_header(decoder, header) > 0 Then
qdh = Header
buf = Alloc(qdh.byte_size + 1)
qr_decoder_get_body(decoder, buf, qdh.byte_size + 1)
' Dereferenziando il "pointer", viene mostrato il testo del "QR Code":
Print String@(buf)
Endif
' Va in chiusura:
qr_decoder_close(decoder)
cvReleaseImage(VarPtr(immago))
Free(buf)
Free(header)
End
Vediamo ora un breve codice per generare il QR code di un testo.
Preciso che questo semplicissimo codice non salverà il disegno del QR Code in un file immagine, ma lo mostrerà in console.... abbiate pazienza ! :'(
Public Struct QRcode
version As Integer
width As Integer
data As Pointer
End Struct
Private Const QR_ECLEVEL_L As Byte = 0 ' Level of error correction: lowest
Private Const QR_MODE_8 As Byte = 2 ' 8-bit data mode
Library "libqrencode:4.1.1"
' QRcode * QRcode_encodeString(const char * String, Int version, QRecLevel level, QRencodeMode hint, Int casesensitive) --> Create a symbol from the string.
Private Extern QRcode_encodeString(testo As String, vers As Integer, level As Integer, hint As Integer, casesensitive As Integer) As QRcode
' void QRcode_free (QRcode *qrcode) --> Free the instance of QRcode class.
Private Extern QRcode_free(qrcode As QRcode)
Public Sub Form_Open()
Dim result As New QRcode
Dim s As String = "http://www.gambas-it.org" ' testo di cui genereremo il QR Code
Dim ms As Stream
Dim j As Short
Dim b As Byte
result = QRcode_encodeString(s, 0, QR_ECLEVEL_L, QR_MODE_8, 1)
' Usiamo i Memory-Stream per dereferenziare in tutta la sua dimensione
' la variabile di tipo "puntatore" del 3° campo della Struttura:
ms = Memory result.data For Read
For j = 0 To (result.width * result.width) - 1
Read #ms, b
If (b And 1) = 1 Then ' Se il LSB del byte è uguale a 1, allora...
Print String$(2, String.Chr(&2588));
Else ' se il LSB è invece uguale a zero, allora....
Print Space(2);
Endif
' Se abbiamo terminato di scrivere in console una riga del QR Code, allora andiamo a capo:
If (j + 1) Mod result.width = 0 Then Print
Next
' Va in chiusura:
QRcode_free(result)
End