unigui 验证码生成
转载自:https://blog.csdn.net/tvmerp/article/details/107736457
//验证码生成单元unit AuthenticodeGenerate;interfaceusesSysUtils, Windows, ExtCtrls, Graphics;function GenerateAuthenticode(const Img: TImage; const Len: Integer = 4): string;implementationconstcCharDigitArrayLen = 6;cCharDigitArray : array[0..cCharDigitArrayLen - 1] of Char = ('3', '4', '5', '6', '7', '8');cCharLowerLetterArrayLen = 13;cCharLowerLetterArray: array[0..cCharLowerLetterArrayLen - 1] of Char = ('b', 'c', 'e', 'h', 'j', 'k', 'm', 'n', 's', 't', 'v', 'w', 'y');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;cFontNameNum = 5;cFontNameArray: array[0..cFontNameNum - 1] of string = ('Arial', 'Tahoma', '宋体', '幼圆', '微软雅黑');{/图像 扭曲变形
function TwistImage(const SrcBmp: TBitmap; XDir: Boolean; MultFactor: Double; Phase: Double; SinTrick: Boolean): TBitmap;
constcTwicePi = 6.283185;
varBaseAxisLen : Double;I, J : Integer;DestX, DestY: Double;OldX, OldY : Integer;Color : TColor;
beginResult := TBitmap.Create;Result.SetSize(SrcBmp.Width, SrcBmp.Height);if XDir thenBaseAxisLen := Result.HeightelseBaseAxisLen := Result.Width;for I := 0 to Result.Width - 1 dobeginfor J := 0 to Result.Height - 1 dobeginif XDir thenDestX := (cTwicePi * J) / BaseAxisLenelseDestX := (cTwicePi * I) / BaseAxisLen;if SinTrick thenbeginDestX := DestX + Phase;DestY := Sin(DestX);end elsebeginDestX := DestX + Phase;DestY := Cos(DestX);end;if XDir thenbeginOldX := I + Round(DestY * MultFactor);OldY := J;end elsebeginOldX := I;OldY := J + Round(DestY * MultFactor);end;Color := SrcBmp.Canvas.Pixels[I, J];if (OldX >= 0) and (OldX < Result.Width) and (OldY >= 0) and (OldY < Result.Height) thenResult.Canvas.Pixels[OldX, OldY] := Color;end;end;
end;}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;elsebeginV := 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;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+4;Y := Random(2) + 4;Img.Canvas.TextOut(X, Y, Result[I + 1]);L := X + Img.Canvas.TextWidth(Result[I + 1]) + Random(2);end;{ /这段代码造成 内存泄漏 的问题if Random(2) = 0 thenbeginif Random(2) = 0 thenImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, True, 8 + Random(3), 1 + Random(2), True)elseImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, False, 8 + Random(3), 1 + Random(2), True);end elsebeginif Random(2) = 0 thenImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, True, 8 + Random(3), 1 + Random(2), False)elseImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, False, 8 + Random(3), 1 + Random(2), False);end;}
{/开始字符串 扭曲变形for I := 0 to Length(Result) - 1 dobeginImg.Canvas.Font.Size := Random(5) + 17;Img.Canvas.Font.Color := RGB(Random(256) and $C0, Random(256) and $C0, Random(256) and $C0);case Random(3) 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 := X + Img.Canvas.TextWidth(Result[I + 1]) + Random(2);end;if Random(2) = 0 thenbeginif Random(2) = 0 thenImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, True, 8 + Random(3), 1 + Random(2), True)elseImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, False, 8 + Random(3), 1 + Random(2), True);end elsebeginif Random(2) = 0 thenImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, True, 8 + Random(3), 1 + Random(2), False)elseImg.Picture.Bitmap := TwistImage(Img.Picture.Bitmap, False, 8 + Random(3), 1 + Random(2), False);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;stm1:TStream;beginimg1 := TImage.Create(self);img1.Width := 120;img1.Height:= 50;///stm1 := TMemoryStream.Create;;///tryUniLabel1.Caption := GenerateAuthenticode(img1,4);///img1.Picture.SaveToStream(stm1);UniImage1.Picture.Bitmap.Assign(img1.Picture.Bitmap);finallyFreeAndNil(img1);end;end;
unigui 验证码生成相关推荐
- 深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)
目录 基础理论 一.生成验证码数据集 1.生成验证码训练集 1-0.判断文件夹是否为空 1-1.创建字符集(数字.大小写英文字母) 1-2.随机生成验证码(1000个,长度为4) 2.生成验证码测试集 ...
- thinkphp3.2 验证码生成和点击刷新验证码
一.实例化生成验证码的类(该方法放到IndexController里面便于访问) [php] /** * 验证码生成 */ public function verify_c(){ ...
- web页面 验证码 生成
web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...
- tp中php验证码程序,thinkPHP 验证码生成与验证
您现在的位置是:网站首页>>PHP>>thinkPHP thinkPHP 验证码生成与验证 发布时间:2018-12-06 13:34:11作者:wangjian浏览量:842 ...
- java 图形校验_java图形验证码生成工具类 web页面校验验证码
java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...
- eoLinker-API_Shop_验证码识别与生成类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等...
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
- java图形验证码生成工具类
转载自 java图形验证码生成工具类 生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...
- 菜鸟学Java(六)——简单验证码生成(Java版)
转载自 菜鸟学Java(六)--简单验证码生成(Java版) 验证码大家都知道,它的作用也不用我多说了吧.如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字.字母或者汉字等) ...
- python生成验证码_python之验证码生成(gvcode与captcha)
今天向大家总结一下python在做项目时用到的验证码生成工具:gvcode与captcha gvcode 全称:graphic-verification-code 安装: pip install gv ...
最新文章
- react-native 开发小结(Android)
- Android 性能优化——绘制优化
- a标签传值到另一个页面_vue-router页面传值及接收值
- 搞懂静态代码分析,看这文就够了!
- java 获得平台编码_关于Java平台的编码
- windows上怎么用libnfc的库函数编程
- centos运行jar包需要的环境_SpringBoot+Vue前后端一次打包为一个Jar包运行
- 史上最全的微信小程序代码大全
- 千月影视APP前端搭建_①_注册apicloud账号密码
- 图像处理(八)图像插值算法
- 对JavaScript中的 事件 进行疯狂 处理
- 20.6.5算法心得 一元二次方程解法
- TT 的旅行日记 Week7作业B题
- CSS里的BFC和IFC的用法
- 怎么截取巨大日志里某一天的log
- 安卓巴士精选Android开发教程
- matlab教程电力电子视频,基于Matlab/Simulink的电力电子仿真演示教学
- 如何实现跳转至QQ 或者QQ的加好友页面。
- 【多目标进化优化】MOPSO 原理与代码实现
- Flutter中文解析乱码问题