Delphi 实现软件版验证码


本文整理自网络,侵删。

 


unit MakeImageCode;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,uImageCode,
  FMX.StdCtrls, FMX.Controls.Presentation, FMX.Objects;

type
  TForm1 = class(TForm)
    lblNum: TLabel;
    BtnRandom: TButton;
    ImgCode: TImage;
    BtnImage: TButton;
    procedure BtnRandomClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BtnImageClick(Sender: TObject);
  private
    { Private declarations }
    FImageCode:TImageCode;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.BtnImageClick(Sender: TObject);
begin
  Self.ImgCode.Bitmap:=FImageCode.CreateBitmap;
end;

procedure TForm1.BtnRandomClick(Sender: TObject);
begin
  Self.lblNum.Text:=FImageCode.GetImageCode;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImageCode:=TImageCode.Create;
end;

end.


引用单元:uImageCode
unit uImageCode;

interface

uses
  SysUtils,Math,FMX.Graphics,System.Types,System.UITypes,FMX.Types,System.Classes;

const
  DEFAULT_CODE_LENGTH = 4;  //验证码的长度  这里是4位
  DEFAULT_FONT_SIZE = 80;   //字体大小
  DEFAULT_LINE_NUMBER = 10;  //多少条干扰线
  DEFAULT_WIDTH = 400;      //默认宽度.图片的总宽
  DEFAULT_HEIGHT = 100;     //默认高度.图片的总高
  DEFAULT_COLOR = $FFE1FFFF;  //默认背景颜色值
  BASE_PADDING_LEFT = 20; //左边距
  RANGE_PADDING_LEFT = 95;//左边距范围值
  BASE_PADDING_TOP = 40;//上边距
  RANGE_PADDING_TOP = 15;//上边距范围值

Type
  TImageCode=class
  private
    //左边距     上边距
    FPaddingLeft,FPaddingTop:Integer;
    //生成的验证码
    FStringCode:String;
    //字符数组
    FArray:array of Char;
    //生成图片
    FBitmap:TBitmap;
    //随即左边距
    procedure RandomPadding();
    //随机颜色
    function RandomColor():Integer;
    //生成验证码
    function CreateCode():String;
  public
    //返回生成的验证码
    function GetImageCode():String;
    //生成验证码图片
    function CreateBitmap():TBitmap;
    //释放Bitmap
    procedure FreeBitmap();
  end;

implementation

{ TImageCode }

function TImageCode.CreateBitmap: TBitmap;
var
  I:Integer;
//  ABitmap:TBitmap;
begin
  FPaddingLeft:= 0; //每次生成验证码图片时初始化
  FPaddingTop:= 0;

  FBitmap:=TBitmap.Create;
  FBitmap.Width:=DEFAULT_WIDTH;
  FBitmap.Height:=DEFAULT_HEIGHT;

  //生成随即验证码
  Self.CreateCode;

  if FBitmap.Canvas.BeginScene then
  try
    //字体大小
    FBitmap.Canvas.Font.Size:= DEFAULT_FONT_SIZE;
    //背景色
    FBitmap.Canvas.Clear(DEFAULT_COLOR);

    //设置验证码每个字母或数字  随即的颜色 左边距
    for I := 0 to Self.CreateCode.Length-1 do
    begin
      //更新左边距
      RandomPadding;
      //字体颜色
      FBitmap.Canvas.Fill.Color:=RandomColor;
      //设置随机字体
      FBitmap.Canvas.Font.Style:=[TFontStyle(Random(3))];
      //绘制文本
      FBitmap.Canvas.FillText(RectF(FPaddingLeft,0,DEFAULT_WIDTH,DEFAULT_HEIGHT),FStringCode.SubString(I,1),False,1, [], TTextAlign.Leading, TTextAlign.Center);
    end;

    //添加干扰线
    for I := 0 to DEFAULT_LINE_NUMBER-1 do
    begin
      //干扰线的随机颜色
      FBitmap.Canvas.Stroke.Color:=RandomColor;
      //设置干扰线的随机开始点 结束点
      FBitmap.Canvas.DrawLine(PointF(Random(DEFAULT_WIDTH),Random(DEFAULT_HEIGHT)), PointF(Random(DEFAULT_WIDTH),Random(DEFAULT_HEIGHT)), $FF);
    end;

  finally
    FBitmap.Canvas.EndScene;
//    FBitmap.Canvas.Free;
  end;

  Result:=FBitmap;
end;

function TImageCode.CreateCode: String;
var
  AString,ACode:String;
  I:Integer;
begin
  AString:='123456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
  SetLength(FArray,Length(AString)+1);
  StrPCopy(@FArray[0],AString);

  ACode:='';
  for I := 0 to DEFAULT_CODE_LENGTH-1 do
  begin
    ACode:=ACode+FArray[Random(Length(FArray)-1)];
  end;
  FStringCode:=ACode;

  Result:=ACode;
end;

procedure TImageCode.FreeBitmap;
begin
  FBitmap.Free;
end;

function TImageCode.GetImageCode: String;
begin
  Result:=FStringCode;
end;

function TImageCode.RandomColor: Integer;
var
//  AString,ATemp:String;
//  AArray:Array of char;
//  I: Integer;

  AStringList:TStringList;
begin
//  AString:='0123456789abcdefABCDEF';
//  SetLength(AArray,Length(AString)+1);
//  StrPCopy(@AArray[0],AString);
//
//  ATemp:='';
//  for I := 0 to 3 do
//  begin
//    Randomize;
//    ATemp:=ATemp+AArray[Random(Length(AArray))];
//  end;
//
//  Result:=StrToInt('$FF'+ATemp+'FF');

   AStringList:=TStringList.Create;
   AStringList.Add('$FFFF1493');
   AStringList.Add('$FF800080');
   AStringList.Add('$FFBA55D3');
   AStringList.Add('$FF9400D3');
   AStringList.Add('$FF8A2BE2');
   AStringList.Add('$FF7B68EE');
   AStringList.Add('$FF6A5ACD');
   AStringList.Add('$FF483D8B');
   AStringList.Add('$FF3CB371');
   AStringList.Add('$FF228B22');
   AStringList.Add('$FF808000');
   AStringList.Add('$FFCD5C5C');
   AStringList.Add('$FF800000');

   try
     Randomize;
     Result:=StrToInt(AStringList[Random(AStringList.Count-1)]);
   finally
     FreeAndNil(AStringList);
   end;

end;

procedure TImageCode.RandomPadding;
begin
  FPaddingLeft:=FPaddingLeft+BASE_PADDING_LEFT + 60;//Random(RANGE_PADDING_LEFT);
  if FPaddingLeft>FPaddingLeft-20 then FPaddingLeft:=FPaddingLeft-20;
  FPaddingTop:=BASE_PADDING_TOP + Random(RANGE_PADDING_TOP);
end;

end.

相关阅读 >>

Delphi中关于canvas.textout的用法

Delphi 判断时间是否合法 -isvaliddatetime、isvaliddate、isvalidtime、isvaliddateday

Delphi unicode转汉字 ,支持自动过滤非 unicode编码

Delphi 批量生成 a到z 字母

Delphi 判断系统服务是否运行

Delphi防止因系统崩溃而丢失任务栏的图标(重建托盘图标)

Delphi 如何从html格式的字符串中提取纯文本?

Delphi通过ip或机器名获取局域网mac地址

Delphi md5加密算法

Delphi 10.3 开发app 在android手机上获取imei

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...