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中的使用方法,如果上述內容有什么不正確的地方,請留言指出,我會及時修正。