uniGUI学习之随机验证码生成及判断

效果图:

uniGUI学习之随机验证码生成及判断(59)_验证码

 

uses AuthenticodeGenerate, ExtCtrls;
  • 1.

AuthenticodeGenerate.pas

unit AuthenticodeGenerate;interfaceusesSysUtils, Windows, ExtCtrls, Graphics;function GenerateAuthenticode(const Img: TImage;const Len: Integer = 4): string;implementationconst
cCharDigitArrayLen = 10;
cCharDigitArray: array [0 .. cCharDigitArrayLen - 1] of Char = ('0', '1', '2', '3', '4', '5', '6','7', '8', '9');cCharLowerLetterArrayLen = 13;
cCharLowerLetterArray: array [0 .. cCharLowerLetterArrayLen - 1]
of wideChar = ('涂', '一', '二', '三', '赵', '王', '孙', '李', '张', '熊', '五', '拼', '磊'); //也可以添加中文字符cCharUpperLetterArrayLen = 19;cCharUpperLetterArray: array [0 .. cCharUpperLetterArrayLen - 1]of Char = ('A', 'B', 'C', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P','Q', 'R', 'S', 'V', 'W', 'Y');cArrayTypeNum = 3;//上面三种 类型数 也可再添加,添加后,在 // 出随机字符串,里添加4对应处理{ cCLen =8;
cCArray: array [0 .. cCLen - 1] of Char = ('-','-','-','-','-','-','-','-');cArrayTypeNum = 4;}cFontNameNum = 5;cFontNameArray: array [0 .. cFontNameNum - 1] of string = ('Arial', 'Tahoma','宋体', '幼圆', '微软雅黑');procedure NoiseImage(const Img: TImage);
constcNoiseLineNum = 5;cNoisePointNum = 50;
varI: Integer;X: Integer;Y: Integer;
beginfor I := 0 to cNoiseLineNum - 1 dobeginImg.Canvas.Pen.Style := psSolid;case Random(3) of0:Img.Canvas.Pen.Color := clBlack;1:Img.Canvas.Pen.Color := clGray;elseImg.Canvas.Pen.Color := clSilver;end;X := Random(Img.Width);Y := Random(Img.Height);Img.Canvas.MoveTo(X, Y);Img.Canvas.LineTo(X + Random(Img.Width - X), Y + Random(Img.Height - Y));end;for I := 0 to cNoisePointNum - 1 dobegincase Random(3) of0:Img.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clBlack;1:Img.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clGray;elseImg.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clSilver;end;end;
end;function GenerateCharacterAuthenticode(const Img: TImage;const Len: Integer = 4): string;
varI: Integer;V: Char;X: Integer;Y: Integer;L: Integer;str: string;
begin// 出随机字符串Result := '';for I := 0 to Len - 1 dobegincase Random(cArrayTypeNum) of0:beginV := cCharDigitArray[Random(cCharDigitArrayLen)];Result := Result + V;end;1:beginV := cCharLowerLetterArray[Random(cCharLowerLetterArrayLen)];Result := Result + V;end;2:beginV := cCharUpperLetterArray[Random(cCharUpperLetterArrayLen)];Result := Result + V;end;end;end;L := 2 + Random(2);str := Result;Img.Picture := nil;// /开始字符串 扭曲变形for I := 0 to Length(str) - 1 dobeginImg.Canvas.Font.Size := Random(5) + 17;   //17为默认字体大小Img.Canvas.Font.Color := RGB(Random(256) and $C0, Random(256) and $C0,Random(256) and $C0);case Random(2) of0:Img.Canvas.Font.Style := [fsBold];1:Img.Canvas.Font.Style := [fsItalic];end;Img.Canvas.Font.Name := cFontNameArray[Random(cFontNameNum)];X := Random(4) + L;Y := Random(2) + 4;Img.Canvas.TextOut(X, Y, Result[I + 1]);L := 8+ X + Img.Canvas.TextWidth(Result[I + 1]) + Random(2);//8为字符间距end;// 制造背景图噪点NoiseImage(Img);
end;function GenerateAuthenticode(const Img: TImage; const Len: Integer): string;
beginResult := GenerateCharacterAuthenticode(Img, Len);
end;initializationRandomize;
end.
  • .

调用及生成

procedure TMainForm.UniImage1Click(Sender: TObject);
varimg1: TImage;
beginimg1 := TImage.Create(self);tryimg1.Width:=250;//图形验证码的宽度img1.Height:=50;//图形验证码的高度UniLabel1.Caption := GenerateAuthenticode(img1, 6);//6为验证码位数,可以改成4UniImage1.Picture.Bitmap.Assign(img1.Picture.Bitmap);finallyFreeAndNil(img1);end;
end;

验证:

登录后复制 

procedure TMainForm.UniButton2Click(Sender: TObject);
begin
if uniEdit1.Text= UniLabel1.Caption then      showmessage('asdf');
end;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278835.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNN和LSTM学习笔记-初学者

提示: 目录 前言一、RNN介绍二、LSTM介绍总结 前言 提示: 提示: 一、RNN介绍 RNN是一种短时记忆,而LSTM是长短时记忆网络 二、LSTM介绍 总结

【Docker六】Docker-consul

目录 一、docker-consul概述 1、服务注册和发现: 1.1、服务注册和发现概念 1.2、服务注册和发现工作机制: 1.3、服务注册与发现的优点: 2、docker-consul概念 2.1、consul的主要特点: 二、consul架构部署: 1、…

Qt 数据库QSqlDatabase使用记录

记录一些在QT中使用QSqlDatabase操作数据库时,需要注意的地方 创建数据库 bool CDBOperatorAbstract::_openDBConn(CDatabaseConfig config) {QWriteLocker locker(&m_locker);QSqlDatabase db;if(QSqlDatabase::contains(m_connectionName)){db QSqlDatabas…

Android解决报错 superclass access check failed: class

Android解决报错 superclass access check failed: class 前言: 最近在打开之前的项目demo时,出现一个错误Cause: superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner 1.错误信息如下: Executio…

微积分-三角函数2

三角函数 在上一节中,讨论了如何在直角三角形中定义三角函数,限制让我们扩展三角函数的定义域。 事实上我们可以取任意角的正弦和余弦,而不只是局限于 0 0 0~ π 2 \frac{\pi}{2} 2π​当中。 当然需要注意的是,正切函数对不是对…

大模型下开源文档解析工具总结及技术思考

1 基于文档解析工具的方法 pdf解析工具 导图一览: PyPDF2提取txt: import PyPDF2 def extract_text_from_pdf(pdf_path):with open(pdf_path, rb) as file:pdf_reader PyPDF2.PdfFileReader(file)num_pages pdf_reader.numPagestext ""f…

【MySQL学习之基础篇】多表查询

文章目录 1. 多表关系1.1. 一对多1.2. 多对多1.3. 一对一 2. 多表查询概述2.1. 数据准备2.2. 概述 3. 查询的分类3.1. 内连接查询3.2. 外连接查询3.3. 自连接3.3.1. 自连接查询3.3.2. 联合查询 3.4. 子查询3.4.1. 概述3.4.2. 标量子查询3.4.3. 列子查询3.4.4. 行子查询3.4.5. 表…

pycharm某个xxx.sh文件显示问号,无法编辑

文章目录 pycharm某个xxx.sh文件显示问号,无法编辑其他参考 pycharm某个xxx.sh文件显示问号,无法编辑 问题描述:pycharm某个xxx.sh文件显示问号,无法编辑 问题分析: pycharm无法识别文件类型。 问题解决: 在pycharm中选中该文件&#xff0…

jmeter前置/后置处理器耗时问题

1. 问题: 需要前置处理器处理一个较为复杂的请求体,循环和判断较多,所以想要验证一下,jmeter在统计业务响应时间时,是否包括前置/后置处理器耗时问题 2. 准备: 创建一个jsr请求,sleep 10毫秒…

TS类型体操-简单-实现pick

文章目录 问题描述举例实现 问题描述 不使用 Pick<T, K> &#xff0c;实现 TS 内置的 Pick<T, K> 的功能。 从类型T 中选出符合 K 的属性&#xff0c;构造一个新的类型。 举例 interface Todo {title: stringdescription: stringcompleted: boolean }type TodoPre…

爆火的“数字人”,你还不知道吗?

数字人是一种基于人工智能技术创建的虚拟实体&#xff0c;具有高度智能化和交互性。他们可以像真正的人类一样思考、学习和表达情感&#xff0c;与人类进行对话和互动。数字人的出现在电影中已经有了一些令人难忘的片段。 首先&#xff0c;值得一提的是电影《阿凡达》中的数字…

10、神秘的“位移主题”

神秘的“位移主题” 1、什么是位移主题2、位移主题的消息格式3、位移主题是怎么被创建的4、什么地方会用到位移主题5、位移主题的删除机制 本章主题是&#xff1a;Kafka 中的内部主题&#xff08;Internal Topic&#xff09;__consumer_offsets。 __consumer_offsets 在 Kafka …