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

2023-12-17 07:22:00

效果图:

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

?

uses AuthenticodeGenerate, ExtCtrls;
  • 1.

AuthenticodeGenerate.pas

unit AuthenticodeGenerate;

interface

uses
  SysUtils, Windows, ExtCtrls, Graphics;

function GenerateAuthenticode(const Img: TImage;
  const Len: Integer = 4): string;

implementation

const
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);
const
  cNoiseLineNum = 5;
  cNoisePointNum = 50;
var
  I: Integer;
  X: Integer;
  Y: Integer;
begin
  for I := 0 to cNoiseLineNum - 1 do
  begin
    Img.Canvas.Pen.Style := psSolid;

    case Random(3) of
      0:
        Img.Canvas.Pen.Color := clBlack;
      1:
        Img.Canvas.Pen.Color := clGray;
    else
      Img.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 do
  begin
    case Random(3) of
      0:
        Img.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clBlack;
      1:
        Img.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clGray;
    else
      Img.Canvas.Pixels[Random(Img.Width), Random(Img.Height)] := clSilver;
    end;
  end;
end;

function GenerateCharacterAuthenticode(const Img: TImage;
  const Len: Integer = 4): string;
var
  I: Integer;
  V: Char;
  X: Integer;
  Y: Integer;
  L: Integer;
  str: string;
begin
  // 出随机字符串
  Result := '';

  for I := 0 to Len - 1 do
  begin
    case Random(cArrayTypeNum) of
      0:
        begin
          V := cCharDigitArray[Random(cCharDigitArrayLen)];
          Result := Result + V;
        end;
      1:
        begin
          V := cCharLowerLetterArray[Random(cCharLowerLetterArrayLen)];
          Result := Result + V;
        end;
      2:
      begin
        V := 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 do
  begin
    Img.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) of
      0:
        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;
begin
  Result := GenerateCharacterAuthenticode(Img, Len);
end;

initialization
    Randomize;
end.
  • .

调用及生成

procedure TMainForm.UniImage1Click(Sender: TObject);
var
  img1: TImage;
begin
  img1 := TImage.Create(self);
  try
     img1.Width:=250;//图形验证码的宽度
     img1.Height:=50;//图形验证码的高度

    UniLabel1.Caption := GenerateAuthenticode(img1, 6);//6为验证码位数,可以改成4
    UniImage1.Picture.Bitmap.Assign(img1.Picture.Bitmap);
  finally
    FreeAndNil(img1);
  end;
end;

验证:

登录后复制?

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

文章来源:https://blog.csdn.net/delphigbg/article/details/135028681
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。