Generare QRCode con Delphi
Sono disponibili diverse librerie commerciali e non per generare BarCode e QrCode con Delphi.
Per la creazione di QR Code, la libreria DelphiZXingQRCode è una delle più affidabili in ambito Delphi.
Questa libreria offre un’interfaccia semplice e diretta per generare QR Code, integrandosi perfettamente nell’ambiente Delphi.
DelphiZXingQRCodeEx è l’evoluzione di quella precedentemente menzionata.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
uses DelphiZXingQRCode; // Esempio di codice per generare un QR Code con DelphiZXingQRCode // ... var Row, Column: Integer; pixelColor : TAlphaColor; vBitMapData : TBitmapData; rSrc, rDest : TRectF; s : widestring; FQRCode: TDelphiZXingQRCode; begin Result := nil; FQRCode := TDelphiZXingQRCode.Create; FQRCode.QuietZone := 4; // FQRCode.Encoding := 0; FQRCode.Encoding := TQRCodeEncoding(0); FQRCode.Data := ContentText; end; |
Praticamente la libreria produce una matrice di valori che rappresentano i dati in formato QRCODE in scala 1, a questo punto ci manca di creare un’immagine che visualizzi il QrCode.
L’immagine generata dalla matrice di ZXing ruisulterebbe estremamente piccola, diciamo che un qrCode con una cinquantina di caratteri potrebbe generare una matrice tipo di 50x50punti.
A questo punto si rende necessario uno scaling della matrice per generare una immagine di una dimensione accettabile, da visualizzare su un monitor o da stampare.
Bisogna anche tenere presente che la maggior parte degli algoritmi di scaling, applicano l’anti-aliasyng il che per le foto è tanto bello ma per una rappresentazione di dati non lo è per niente.
A questo punto ho deciso di creare una funzione di ingrandimento partendo dai dati generati da ZXing per produrre una bitmap e ho scritto una funzinoe che crea una bitmap con un fattore di ingrandimento, ho decio di usare Firemonkey per essere un pelo più modero:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
function THHPSvcQrCode.GenQrImage(ContentText: string; Ingrandimento : Byte = 5): TBitMap; var Row, Column: Integer; pixelColor : TAlphaColor; vBitMapData : TBitmapData; rSrc, rDest : TRectF; s : widestring; FQRCode: TDelphiZXingQRCode; begin Result := nil; FQRCode := TDelphiZXingQRCode.Create; FQRCode.QuietZone := 4; FQRCode.Encoding := TQRCodeEncoding(0); FQRCode.Data := ContentText; try result := TBitmap.Create(FQRCode.Rows * Ingrandimento, FQRCode.Columns * Ingrandimento) ; if not Result.Map(TMapAccess.Write, vBitMapData) then raise exception.Create('No map for bitmap'); for Row := 0 to (FQRCode.Rows * Ingrandimento) - 1 do begin for Column := 0 to (FQRCode.Columns * Ingrandimento) - 1 do begin if (FQRCode.IsBlack[(Row div Ingrandimento), (Column div Ingrandimento)]) then pixelColor := TAlphaColors.Black else pixelColor := TAlphaColors.White; vBitMapData.SetPixel(Column, Row, pixelColor); end; end; finally FQRCode.Free; Result.Unmap(vBitMapData); end; end; |