1.首先生成不重复的字符串,以下是主要代码:
int
rep = 0;
string
str =
string
.Empty;
long
num2 =
DateTime
.Now.Ticks + rep;
rep++;
Random
random =
new
Random
(((
int
)(((
ulong
)num2) & 0xffffffffL)) | ((
int
)(num2 >> rep)));
for
(
int
i = 0; i < 4; i++)
{
char
ch;
int
num = random.Next();
if
((num % 2) == 0)
{
ch = (
char
)(0x30 + ((
ushort
)(num % 10)));
}
else
{
ch = (
char
)(0x41 + ((
ushort
)(num % 0x1a)));
}
str = str + ch.ToString();
}
Code = str;
该算法会生成0,o,1,i等容易混淆的字符,后期我们会稍作调整。
2.生成字符过后,我们需要把字符生成图片。
int
randAngle = 45;
//
随机转动角度
int
mapwidth = (
int
)(Code.Length * 22);
Bitmap
map =
new
Bitmap
(mapwidth, 28);
//
创建图片背景
Graphics
graph =
Graphics
.FromImage(map);
graph.Clear(
Color
.AliceBlue);
//
清除画面,填充背景
Random
rand =
new
Random
();
//
验证码旋转,防止机器识别
char
[] chars = Code.ToCharArray();
//
拆散字符串成单字符数组
//
文字距中
StringFormat
format =
new
StringFormat
(
StringFormatFlags
.NoClip);
format.Alignment =
StringAlignment
.Center;
format.LineAlignment =
StringAlignment
.Center;
再画一条曲线连接所有字符
double
x1 = 10;
double
y1 = 0;
for
(
double
x = 1; x < 720; x++)
{
Pen
pen =
new
Pen
(
Color
.Blue, rand.Next(3));
//SIN
最大值为
1,
而我图上用了
100
像素
,
所以有
//100/1=100
故而
y
要乘
100;
// x/180*Math.PI
这个表达式把角度换成弧度值
double
y =
Math
.Sin(x / 180 *
Math
.PI) * 28;
//SIN
值一个循环为
360
度,而我图上用了
200
像素表示,所以有:
//360/200=1.8
故而
x
值要除
1.8
graph.DrawLine(pen, (
float
)x1, (
float
)y1 + 1, (
float
)(x) + 1, (
float
)y + 1);
x1 = x + 1;
y1 = y;
}
string
[] fontArray = {
"Verdana"
,
"Microsoft Sans Serif"
,
"Comic Sans MS"
,
"Arial"
,
"
宋体
"
};
for
(
int
i = 0; i < chars.Length; i++)
{
Font
fontstyle =
new
Font
(fontArray[rand.Next(5)], rand.Next(20, 22),
FontStyle
.Regular);
//
字体样式
Point
dot =
new
Point
(rand.Next(14, 16), 16);
//graph.DrawString(dot.X.ToString(), fontstyle, new SolidBrush(Color.Black), 10, 150); //
测试
X
坐标显示间距的
float
angle = rand.Next(-randAngle, randAngle);
//
转动的度数
graph.TranslateTransform(dot.X, dot.Y);
//
移动光标到指定位置
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), fontstyle,
new
SolidBrush
(
Color
.Blue), 1, 1, format);
graph.RotateTransform(-angle);
//
转回去
graph.TranslateTransform(2, -dot.Y);
//
移动光标到指定位置
}
//
生成图片
System.IO.
MemoryStream
ms =
new
System.IO.
MemoryStream
();
map.Save(ms, System.Drawing.Imaging.
ImageFormat
.Gif);
CodeMap =
new
Bitmap
(map);
graph.Dispose();
map.Dispose();
用javascript制作验证码生成随机字符串 验证码生成代码
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
生成验证码-超简单
轻松应对验证挑战:简单验证码的实现方法!
验证码 Java -
随机生成验证码
这里是我个人学习随机验证码后,摘要的一部分代码!供大家学习参考!共同努力!!!!
职场 验证 休闲 随机 -
随机验证码生成
验证码生成
课后练习 -
自动生成验证码JavaScript代码 js如何生成验证码
一、主要功能介绍: 1、通过for循环生成生成六位随机验证码 2、通过for循环随机生成验证码颜色 3、窗口加载事件,窗口一加载就调用函数,重置验证码 4、按钮点击事件,一点击就调用函
自动生成验证码JavaScript代码 javascript html 原生js 随机验证码