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中的使用方法,如果上述内容有什么不正确的地方,请留言指出,我会及时修正。

posted @ 2017-06-07 13:32  Huixch  阅读(5967)  评论(6编辑  收藏  举报