zoukankan      html  css  js  c++  java
  • 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_ Integer;
        border_ 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;
         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_ 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中的使用方法,如果上述内容有什么不正确的地方,请留言指出,我会及时修正。

  • 相关阅读:
    VS Code中编写C
    Latex
    JAVA学习-----容器和数据结构
    Markdown2最最基本操作说明(未完待续)
    [lua] table.sort(_table, comp)使用要点
    [coco2d]pageView:addPage时,page无法对齐
    [cocos2d]修改富文本文本和高度
    [cocos2d]格式化获取当前layer的控件名
    [c++]牛客刷题记录2.18
    [c++]STL学习
  • 原文地址:https://www.cnblogs.com/huixch/p/6956573.html
Copyright © 2011-2022 走看看