首页 > 其他分享 >uniGUI学习之随机验证码生成及判断(59)

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

时间:2023-02-15 11:57:10浏览次数:46  
标签:begin Canvas end uniGUI Img Random 验证码 Result 59

效果图:

uses AuthenticodeGenerate, ExtCtrls;
AuthenticodeGenerate.pas
unit AuthenticodeGenerate;

interface

uses
  SysUtils, Windows, ExtCtrls, Graphics;

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

implementation

const
  cCharDigitArrayLen = 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',
    '宋体', '幼圆', '微软雅黑');

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;
    else
      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;
    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 := X + Img.Canvas.TextWidth(Result[I + 1]) + Random(2);
  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
    UniLabel1.Caption := GenerateAuthenticode(img1, 6);//6为验证码位数,可以改成4
    UniImage1.Picture.Bitmap.Assign(img1.Picture.Bitmap);
  finally
    FreeAndNil(img1);
  end;
end;

 

标签:begin,Canvas,end,uniGUI,Img,Random,验证码,Result,59
From: https://www.cnblogs.com/tulater/p/17122299.html

相关文章

  • 1599 - 米老鼠偷糖果
       ......
  • 【OpenCV小练手】-仿造验证码去除干扰因子
    ......
  • 3592、汉明距离
    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给你两个整数x和y,计算并返回它们之间的汉明距离。示例1:输入:x=1,y=4输出:2解释:1 (00......
  • 3594、分糖果
    Alice有n枚糖,其中第i枚糖的类型为candyType[i]。Alice注意到她的体重正在增长,所以前去拜访了一位医生。医生建议Alice要少摄入糖分,只吃掉她所有糖的n/2即可(n......
  • 3596、三除数
    给你一个整数n。如果n恰好有三个正除数,返回true;否则,返回false。如果存在整数k,满足n=k*m,那么整数m就是n的一个除数。示例1:输入:n=2输出:false解释:2......
  • 3595、反转两次的数字
    反转一个整数意味着倒置它的所有位。例如,反转2021得到1202。反转12300得到321,不保留前导零。给你一个整数num,反转num得到reversed1,接着反转reversed1得到......
  • 3598、寻找比目标字母大的最小字母
    给你一个排序后的字符列表letters,列表中只包含小写英文字母。另给出一个目标字母target,请你寻找在这一有序列表里比目标字母大的最小字母。在比较时,字母是依序循环出现的......
  • 3599、第 N 个泰波那契数
    泰波那契序列Tn定义如下:T0=0,T1=1,T2=1,且在n>=0的条件下Tn+3=Tn+Tn+1+Tn+2给你整数n,请返回第n个泰波那契数Tn的值。示例1:输入:n=4输出:4解释......
  • 3597、找到所有数组中消失的数字
    给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。示例1:输入:nums=[4......
  • 3593、找到小镇的法官
    小镇里有n个人,按从1到n的顺序编号。传言称,这些人中有一个暗地里是小镇法官。如果小镇法官真的存在,那么:小镇法官不会信任任何人。每个人(除了小镇法官)都信任这位小镇法......