需要用到 DelphiZXingQRCode 单元,这个单元可以到作者的官网去下载。这个函数只是一个简单的封装:
function GenerateQRCode(AData: String):TBitmap; var AQRCode: TDelphiZXingQRCode; R: Integer; C: Integer; ABitmapData: TBitmapData; begin Result := TBitmap.Create; AQRCode := TDelphiZXingQRCode.Create; try AQRCode.Data := AData; AQRCode.Encoding := qrUTF8BOM; AQRCode.QuietZone := 4; Result.SetSize(AQRCode.Columns, AQRCode.Rows); if Result.Map(TMapAccess.Write, ABitmapData) then begin for R := 0 to AQRCode.Rows - 1 do begin for C := 0 to AQRCode.Columns - 1 do begin if AQRCode.IsBlack[R, C] then ABitmapData.SetPixel(C, R, TAlphaColors.Black) else ABitmapData.SetPixel(C, R, TAlphaColors.White); end; end; Result.Unmap(ABitmapData); end else FreeAndNil(Result); finally FreeAndNil(AQRCode); end; end;
用法:调用这个函数,返回一个TBitmap,你用来显示也好,干啥也好不用了释放了就好,没啥可说的。如果要将其放大绘制到一个画布上,调用画布的 DrawBitmap 方法即可,注意其中 HighSpeed 设置为 True,以避免进行平滑处理。
至于 VCL 的版本,愿意就自己改一个吧,不愿意,就算了,当我没说。
crystalxp 提供的VCL版
function GenerateQRCode(AData: String): TBitmap; type TRGBTriple = PACKED RECORD rgbtBlue: Byte; rgbtGreen: Byte; rgbtRed: Byte; END; pRGBTripleArray = ^TRGBTripleArray; TRGBTripleArray = ARRAY [0 .. 0] OF TRGBTriple; var AQRCode: TDelphiZXingQRCode; R: Integer; c: Integer; Line: pRGBTripleArray; begin Result := TBitmap.Create; AQRCode := TDelphiZXingQRCode.Create; try AQRCode.Data := AData; AQRCode.Encoding := qrUTF8BOM; AQRCode.QuietZone := 2; Result.SetSize(AQRCode.Columns, AQRCode.Rows); Result.PixelFormat := pf24bit; for R := 0 to AQRCode.Rows - 1 do begin Line := Result.Scanline[R]; for c := 0 to AQRCode.Columns - 1 do begin if (AQRCode.IsBlack[R, c]) then begin Line[c].rgbtBlue := 0; Line[c].rgbtGreen := 0; Line[c].rgbtRed := 0; end else begin Line[c].rgbtBlue := 255; Line[c].rgbtGreen := 255; Line[c].rgbtRed := 255; end; end; end; finally FreeAndNil(AQRCode); end; end;