Generare un QRCode con Python
Ormai tutti abbiamo a che fare con i QRCode: Green Pass (e non solo) ci hanno costretto a scoprire questa tecnologia. Ma come funziona un QRCode con Python?
In questo articolo, vediamo come creare un programma che sia in grado di generare un codice QR a partire da un semplice testo, e anche come estrarre il contenuto di un’immagine già presente.
Cos’è il QRCode
Si tratta di un formato di codice a barre costituito da moduli neri su sfondo bianco, attraverso i quali è possibile trasmettere delle informazioni.
In un solo QRcode possono essere contenuti fino a 7.089 caratteri numerici o 4.296 alfanumerici, al contrario dei tradizionali codici a barre.
Esempio di QRCode: riesci a leggere cosa c’è scritto?
Sapevi inoltre che il nome “QR” è l’abbreviazione dell’inglese Quick Response (ossia “risposta rapida”)? Questo perché l’idea nasce nel 1994 nelle fabbriche della Toyota, dove il codice QR per tracciare i pezzi di automobili, dal momento che questo tipo di codifica permette di inserire diverse informazioni con una rapida decodifica del suo contenuto!
Come generare un QRCode
Per generare un codice QR esistono moltissimi siti online, ma perché non farlo con Python?
Il codice è estremamente semplice. Per prima cosa, installiamo la libreria qrcode con il seguente comando:
pip install qrcode
Dopodiché, andiamo ad importarla tramite il seguente codice:
import qrcode
A questo punto, possiamo creare il codice QR con la seguente istruzione:
qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4,)
qr.add_data('https://www.patreon.com/theredcode_it')
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
im1 = img.save("test.webp")
Con la prima riga, andiamo a definire le proprietà del QRcode: il parametro version è un numero intero compreso tra 1 e 40 che controlla la dimensione del QR Code (il più piccolo è rappresentato dalla versione 1 e sarà una matrice 21x21).
Il parametro error_correction controlla la correzione degli errori utilizzata per il QR Code, e ne esistono quattro varianti, a seconda della percentuale di errori che vogliamo correggere.
Il parametro box_size controlla quanti pixel è ogni “scatola” del codice QR, e in questo caso saranno 10x10; stessa vale per il border, che rappresenta la dimensione in pixel del bordo del codice QR.
Se volessimo che il dimensionamento avvenisse in maniera automatica, sarà sufficiente impostare su None e utilizzare il parametro fit durante la creazione del codice per determinarlo automaticamente, come mostrato nella riga 3.
fill_color e back_color nella penultima riga possono cambiare lo sfondo e il colore dell’immagine del codice QR e accettano entrambi tuple di colore RGB.
Una volta eseguito il codice, l’ultima riga farà sì che il QR code generato sia salvato all’interno della cartella del progetto.
Semplice, no?
Come estrarre da un QRCode
Abbiamo visto come inserire delle informazioni all’interno di un QRCode, ma vediamo come estrarle.
Per farlo, avremo bisogno di installare due pacchetti, ossia Pillow e pyzbar tramite il seguente comando:
pip install pyzbar
pip install pillow
Una volta importate le librerie, potremo procedere a fornire l’immagine da decodificare, come mostrato nella prima riga.
from pyzbar.pyzbar import decode
from PIL import Image
data = decode(Image.open('test.webp'))
print(data)
data = data[0].data
print(data.decode("utf-8"))
Le ultime due righe sono necessarie per recuperare i dati contenuti nel QRCode: infatti, utilizzando l’oggetto decodificato, questo è il risultato che otterremmo:
[Decoded(data=b'https://www.patreon.com/theredcode_it', type='QRCODE', rect=Rect(left=39, top=39, width=292, height=292), polygon=[Point(x=39, y=39), Point(x=39, y=330), Point(x=331, y=331), Point(x=330, y=39)])]
Non molto chiaro, no?
Questo perché la libreria pyzbar utilizza un oggetto chiamato Decoded per incapsulare tutte le informazioni relative al QRCode, come la dimensione, la tipologia di codice, e via dicendo.
Dal momento che si tratta di una lista, prendiamo il primo oggetto e prendiamo la proprietà data della tupla risultante:
data = data[0].data
print(data.decode("utf-8"))
Un gioco da ragazze!