Delphi 生成二维码【PaintBox】并保存为本地文件添加至【Image】控件中

RAD Studio 10.3 测试√

需要控件:scEdit、scGPButton、Image、PaintBox
在这里插入图片描述
需要声明:DelphiZXIngQRCode
下载地址:「DelphiZXIngQRCode.pas」https://www.aliyundrive.com/s/VXokj7kUD5i
【同时记得把路径也添加了,能搜索到就行,不管用那种方法】


  private
    QRCodeBitmap: TBitmap;
  public
    procedure Update;

窗体的 OnCreate事件 和 OnDestroy事件

procedure TForm1.FormCreate(Sender: TObject);                                 // 窗体创建
begin
  QRCodeBitmap := TBitmap.Create;                                             // 代码图位
  Update;
end;

procedure TForm1.FormDestroy(Sender: TObject);                                // 窗体销毁
begin
  QRCodeBitmap.Free;
end;

PaintBox的 OnPaint事件

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  Scale: Double;
begin
  PaintBox1.Canvas.Brush.Color := clRed;                                      // 背景颜色
  PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Height, PaintBox1.Width));   // 填充矩形
  if ((PaintBox1.Width > 0) and (PaintBox1.Height > 0)) then
  begin
    if PaintBox1.Width < PaintBox1.Height then
    begin
      Scale := PaintBox1.Width / QRCodeBitmap.Width;
    end
    else
    begin
      Scale := PaintBox1.Height / QRCodeBitmap.Height;
    end;
    { StretchDraw(Rect, Jpg); }
    { Rect:是你要画的区域(你要放大就设置的大一些,缩小就设置的小一些) }
    { Jpg:是要画的东西(我这里只是用Jpg文件做例子) }
    PaintBox1.Canvas.StretchDraw(Rect(0, 0, Trunc(Scale * QRCodeBitmap.Width), Trunc(Scale * QRCodeBitmap.Height)), QRCodeBitmap);
  end;
end;

自己声明的 Updata方法

procedure TForm1.Update;
var
  QRCode: TDelphiZXingQRCode;
  Column, Row: Integer;
begin
  QRCode := TDelphiZXingQRCode.Create;
  try
    QRCode.Data := scEdit1.Text;                                              // 数据
    QRCode.Encoding := TQRCodeEncoding(5);                                    // 编码方式 【qrUTF8BOM】
    QRCode.QuietZone := StrToIntDef(scEdit2.Text, 1);                         // 边框区域
    QRCodeBitmap.SetSize(QRCode.Rows, QRCode.Columns);                        // 设定大小
    {【Row:行  ;  Column:列】}
    for Row := 0 to QRCode.Rows - 1 do                                        // 循环行
    begin
      for Column := 0 to QRCode.Columns - 1 do                                // 循环列
      begin
        if (QRCode.IsBlack[Row, Column]) then                                 // 判断二维码次坐标是否是黑色的
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clGreen;                 // 是的就给画布画上绿色
        end
        else
        begin
          QRCodeBitmap.Canvas.Pixels[Column, Row] := clWhite;                 // 否则就画白色
        end;
      end;
    end;
  finally
    QRCode.Free;
  end;
  PaintBox1.Repaint;                                                          // 重涂
end;

就目前上面的代码就已经可以实现生成二维码了,还可以在 scEditOnChange事件中添加 Update方法

procedure TForm1.scEdit1Change(Sender: TObject);
begin
  Update;
end;

下面就是吧 PaintBox中的内容保存至本地以及添加到 Image控件中

procedure SaveBmpFromPaintBox(pbox: TPaintBox; fn: string);
var
  bmp: TBitmap;
  r: TRect;
begin
  bmp := TBitmap.Create;                                                      // 创建图位
  bmp.Width := pbox.Width;                                                    // 图位宽 = 盒子宽度
  bmp.Height := pbox.Height;                                                  // 图位高 = 盒子高度
  try
    r := Rect(0, 0, pbox.Height, pbox.Width);                                 // 矩形图的 左上右下 四边
    { 如果图象一【r1】的选取区域小于图象二【r2】中的选取区域,那么图一【r1】选取区域中的图象,
    拉伸填充到图象二【r2】中的选取区域。(图象区域相同的复制不会造成图象失真,如果变大或者变小,就容易造成失真) }
    bmp.Canvas.CopyRect(r, pbox.Canvas, r); { 两个 r 在上面分别用【r1、r2】表示(从左至右),中间参数为拷贝内容 }
    bmp.SaveToFile(fn);                                                       // 文件保存地址
  finally
    FreeAndNil(bmp);
  end;
end;

procedure TForm1.scGPButton2Click(Sender: TObject);
begin
  SaveBmpFromPaintBox(paintbox1, 'd:\test.bmp');                              // 保存到本地 【需要改成jpg或png的直接改文件的后缀即可】
  Image1.Picture.LoadFromFile('d:\test.bmp');                                 // 本地图片展示到 Image 上
end;

笔记源码


学习中记录的一点点笔记,以便以后翻阅。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小印丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值