效果图:
?
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 = 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;