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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM