-
Notifications
You must be signed in to change notification settings - Fork 44
/
Facturacion.GeneradorQR.pas
130 lines (112 loc) · 3.3 KB
/
Facturacion.GeneradorQR.pas
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
unit Facturacion.GeneradorQR;
interface
uses
{$IF CompilerVersion >= 23}
System.SysUtils
{$ELSE}
SysUtils
{$IFEND}
;
type
TGeneradorQR = class
public
procedure GenerarQRCode(const aTexto: String;
const aRutaAGuardar: TFileName);
end;
implementation
{.$define USAR_PNGIMAGE} //Para forzar el uso de PNGImage (Delphi 7, 2007}
{$IF CompilerVersion >= 20}
{$IFNDEF USAR_PNGIMAGE}
{$define USAR_PNGIMAGE}
{$ENDIF}
{$IFEND}
uses DelphiZXingQRCode,
{$IF CompilerVersion >= 23}
Vcl.Imaging.pngimage,
Vcl.Imaging.jpeg,
System.Classes,
Vcl.Graphics
{$ELSE}
{$IFDEF USAR_PNGIMAGE}
pngimage,
{$ENDIF}
jpeg,
Classes,
Graphics
{$IFEND}
;
const
_ANCHO_QR_CODE = 1200;
_ALTO_QR_CODE = 1200;
{ TGeneradorCBBGenerico }
procedure TGeneradorQR.GenerarQRCode(const aTexto: String; const
aRutaAGuardar: TFileName);
var
QRCode: TDelphiZXingQRCode;
Row, Column: Integer;
QRCodeBitmap, bmpFinal: TBitmap;
imgResultado: TGraphic;
Scale: Double;
begin
// Checamos que los parámetros esten correctos
Assert(aRutaAGuardar <> '', 'La ruta fue vacia');
// 2. Generamos la imagen auxiliándonos de la liberia Quaricol
if SameText( ExtractFileExt(aRutaAGuardar), '.bmp') then
imgResultado := TBitmap.Create
else if SameText( ExtractFileExt(aRutaAGuardar), '.jpg') or
SameText( ExtractFileExt(aRutaAGuardar), '.jpeg') then
imgResultado := TJPEGImage.Create
{$IFDEF USAR_PNGIMAGE}
else if SameText( ExtractFileExt(aRutaAGuardar), '.png') then
imgResultado := TPngImage.Create
{$ENDIF}
else if SameText( ExtractFileExt(aRutaAGuardar), '.wmf') then
imgResultado := TMetafile.Create
else
raise Exception.Create('No se pudo determinar la clase gráfica para el archivo: '+ExtractFileName(aRutaAGuardar));
QRCodeBitmap := TBitmap.Create;
bmpFinal := TBitmap.Create;
bmpFinal.Width := _ANCHO_QR_CODE;
bmpFinal.Height := _ALTO_QR_CODE;
QRCode := TDelphiZXingQRCode.Create;
try
QRCode.Data := aTexto;
QRCode.Encoding := qrAuto;
// Margen del QR Code
QRCode.QuietZone := 1;
{$IF CompilerVersion >= 20}
QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);
{$ELSE}
QRCodeBitmap.Height := QRCode.Rows;
QRCodeBitmap.Width := QRCode.Columns;
{$IFEND}
for Row := 0 to QRCode.Rows - 1 do
begin
for Column := 0 to QRCode.Columns - 1 do
begin
if (QRCode.IsBlack[Row, Column]) then
QRCodeBitmap.Canvas.Pixels[Column, Row] := clBlack
else
QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;
end;
end;
// Re-dimensionamos el Bitmap del QR a las dimensiones finales de nuestro QR Code
if (bmpFinal.Width < QRCodeBitmap.Height) then
Scale := bmpFinal.Width / QRCodeBitmap.Width
else
Scale := bmpFinal.Height / QRCodeBitmap.Height;
// Transferimos el QR redimensionado al BMP "final"
bmpFinal.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap);
try
// Le asignamos el bitmap y la guardamos
imgResultado.Assign(bmpFinal);
imgResultado.SaveToFile(aRutaAGuardar);
finally
end;
finally
QRCode.Free;
bmpFinal.Free;
imgResultado.Free;
end;
end;
end.