Delphi使用Zint生成QR二维条码(zint.dll)
Delphi使用Zint生成QRCODE
本文使用的Zint Barcode Library(zint.dll)版本为2.6.0,和之前使用的2.4.3版本在zint_symbol这个结构体上会有差异。
文件下载地址:https://sourceforge.net/projects/zint/files/zint/2.6.0/,下载zint-2.6.0_win32_qtZint_cmd_tcl.zip这个文件,里面包含了要使用的zint.dll
在Delphi定义和zint_symbol对应的结构体和常量:
type TZintSymbol = packed record symbology: Integer; height: Integer; whitespace_width: Integer; border_width: Integer; output_options: Integer; fgcolour: array[0..9] of AnsiChar; bgcolour: array[0..9] of AnsiChar; outfile: array[0..255] of AnsiChar; scale: Single; option_1: Integer; option_2: Integer; option_3: Integer; show_hrt: Integer; input_mode: Integer; eci: Integer; text: array[0..127] of AnsiChar; rows: Integer; width: Integer; primary: array[0..127] of AnsiChar; encoded_data: array[0..199, 0..142] of AnsiChar; row_height: array[0..199] of Integer; // Largest symbol is 189 x 189 errtxt: array[0..99] of AnsiChar; bitmap: PAnsiChar; bitmap_width: Integer; bitmap_height: Integer; bitmap_byte_length: Cardinal; dot_size: Single; rendered: Pointer; debug: Integer; end; PZintSymbol = ^TZintSymbol; const // Tbarcode 7 codes BARCODE_QRCODE = 58;
定义生成QRCODE要使用的函数:
const LibName = 'zint.dll'; //struct zint_symbol *ZBarcode_Create(void); function ZBarcode_Create(): PZintSymbol; cdecl; external LibName; //void ZBarcode_Delete(struct zint_symbol *symbol); procedure ZBarcode_Delete(symbol: PZintSymbol); cdecl; external LibName; //int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); function ZBarcode_Encode_and_Buffer(symbol: PZintSymbol; input: PAnsiChar; length, rotate_angle: Integer): Integer; cdecl; external LibName; // create bitmap 这个函数是使用编码后的条码图像数据生成Bitmap文件,不属于zint,因此不在zint.h头文件中,上面的三个在zint.h头文件中。 procedure ZBarcode_To_Bitmap(symbol: PZintSymbol; const ABitmap: TBitmap);
生成QRCODE的方法:
以下代码将生成一个QR二维条码并显示在图像控件Image1上
procedure TForm1.Button1Click(Sender: TObject); var lvData: UTF8String; // 使用UTF8编码的字符串 lvBitMap: TBitmap; lvSymbol: PZintSymbol; lvErrorNumber: Integer; lvErrorText: string; begin lvSymbol := ZBarcode_Create(); if lvSymbol = nil then Exit; lvBitMap := TBitmap.Create; try lvData := UTF8String(Edit1.Text); // 条码类型设置为QRCODE lvSymbol.symbology := BARCODE_QRCODE; // 编码 lvErrorNumber := ZBarcode_Encode_and_Buffer(lvSymbol, PAnsiChar(lvData), Length(lvData), 0); // 编码成功 if lvErrorNumber = 0 then begin // 生成Bitmap图形 ZBarcode_To_Bitmap(lvSymbol, lvBitMap); // 显示在Image中 Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; Image1.Picture.Bitmap.Canvas.Brush.Color := clWhite; Image1.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height)); Image1.Picture.Bitmap.Canvas.StretchDraw(Rect(10, 10, Image1.Width - 10, Image1.Height - 10), lvBitMap); end else begin Image1.Picture.Bitmap.Width := Image1.Width; Image1.Picture.Bitmap.Height := Image1.Height; Image1.Picture.Bitmap.Canvas.Brush.Color := clWhite; Image1.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, Image1.Width, Image1.Height)); lvErrorText := String(AnsiString(lvSymbol.errtxt)); ShowMessage('编码时发生错误:' + lvErrorText); end; finally lvBitMap.Free; lvBitMap := nil; ZBarcode_Delete(lvSymbol); end; end;
生成图像函数ZBarcode_To_Bitmap的代码:
procedure ZBarcode_To_Bitmap(symbol: PZintSymbol; const ABitmap: TBitmap); var SrcRGB: PRGBTriple; Row, RowWidth: Integer; begin ABitmap.PixelFormat := pf24bit; ABitmap.SetSize(symbol.bitmap_width, symbol.bitmap_height); SrcRGB := Pointer(symbol.bitmap); RowWidth := symbol.bitmap_width * 3; for Row := 0 to symbol.bitmap_height - 1 do begin CopyMemory(ABitmap.ScanLine[Row], SrcRGB, RowWidth); Inc(SrcRGB, symbol.bitmap_width); end; SetBitmapBits(ABitmap.Handle, symbol.bitmap_width * symbol.bitmap_height * 3, symbol.bitmap); end;
生成QRCODE时会用到的几个参数:
1、TZintSymbol.symbology 条码类型,本例中使用BARCODE_QRCODE,对应的值为58,更多条码类型参考zint.h头文件中的定义
2、TZintSymbol.option_1 容错级别,本例中没有设置。对应的值为1、2、3、4 ,也就是LEVEL_L、LEVEL_M、LEVEL_Q、LEVEL_H
3、TZintSymbol.option_2 图像大小,取值范围为1 - 40,数值越大生成的图像越大。
3、TZintSymbol.input_mode 输入类型,取值范围0、1、2、3、4,分别表示DATA_MODE、UNICODE_MODE、GS1_MODE、KANJI_MODE、SJIS_MODE;默认值为0,即DATA_MODE。
建议处理中文时使用DATA_MODE,并将输入内容编码为UTF8。
以上就是Zint Barcode Library(zint.dll)在Delphi中的使用方法,如果上述内容有什么不正确的地方,请留言指出,我会及时修正。