网站上的验证码是怎么产生的?

来源:互联网 发布:java和python知乎 编辑:程序博客网 时间:2024/06/10 07:55

目前,许多网站的会员登录时都要求输入验证码,尽管验证码的形式五花八门,但是所使用的原理基本是一样的,都是生成随机字符串,然后描绘成图片的形式输出。

   验证码的生产主要分两部分:1是随机字符串的生成;2是生产验证码图片

1. 随机字符串的生成:

随机字符串生成有很多方法,这里介绍一种利用字符数组生产随机串的方法

代码如图1所示,自定义自己的随机字符数组,然后使用随机函数随机抽取4个字符组成一个随机字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
 /// 生成随机字符串
 /// </summary>
 /// <returns></returns>
 private string GenerateCheckCode()
 {
 // PageUtils.VerifyCode = checkCode.ToLower();
 //自定义自己验证码需要显示的字符
 //如果仅仅是数字和26个字母,您可以写一个循环遍历
 char[] myCodeChar = { '1', '2', '3', '4', '5', 'a', 'b', 'c', 'd', 'e', 'f' };
 int number;
 char code;
 string checkCode = string.Empty;
 //使用随机函数,产生一个随机数
 System.Random random = new Random();
 for (int i = 0; i < 4; i++)
 {
 number = random.Next(myCodeChar.Length);
 code = (char)(myCodeChar[number]);
 checkCode += code.ToString();
 }
 Session["checkCode"] = checkCode.ToLower();//把生成的验证码存入session
 return checkCode;
 }

图1

2 生产验证码图片,其实就是用c#的Graphics把生成的随机串描绘到图片上,具体请看图2代码示意:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

/// <summary>
 /// 生成验证码图片,并输出
 /// </summary>
 /// <param name="checkCode"></param>
 private void CreateCheckCodeImage(string checkCode)
 {
 if (checkCode == null || checkCode.Trim() == String.Empty) return;
 Matrix m = new Matrix();//定义几何变换
 Bitmap charbmp = new Bitmap(90, 30);//图片前景色,即生成背景透明的随机字符串图片
 //定义字体
 Font[] fonts = {
 new Font(new FontFamily("Times New Roman"), 17, FontStyle.Regular),
 new Font(new FontFamily("Georgia"), 17, FontStyle.Regular),
 new Font(new FontFamily("Arial"), 17, FontStyle.Regular),
 new Font(new FontFamily("Comic Sans MS"), 17, FontStyle.Regular)
 };
 //定义图片背景色
 System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 22.5)), 30);
 //开始描绘
 Graphics g = Graphics.FromImage(image);
 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
 //定义背景色为白色
 g.Clear(Color.White);
 try
 {
 Random random = new Random(); //生成随机生成器
 g.Clear(Color.White); //清空图片背景色
 for (int i = 0; i < 2; i++) //画图片的背景噪音线,i表示画多少条噪音线
 {
 int x1 = random.Next(image.Width);
 int x2 = random.Next(image.Width);
 int y1 = random.Next(image.Height);
 int y2 = random.Next(image.Height);
 g.DrawLine(new Pen(Color.Black), x1, y1, x2, y2);
 }
 //开始描绘前景图
 Graphics charg = Graphics.FromImage(charbmp);
 SolidBrush drawBrush = new SolidBrush(Color.FromArgb(random.Next(101), random.Next(101), random.Next(101)));
 float charx = -18;
 //把随机字符串,逐个写入前景图
 for (int i = 0; i < checkCode.Length; i++)
 {
 m.Reset();
 m.RotateAt(random.Next(31) - 25, new PointF(random.Next(4) + 7, random.Next(4) + 7));
 charg.Clear(Color.Transparent);//定义前景图为透明
 charg.Transform = m;
 //定义前景色为黑色
 drawBrush.Color = Color.Black;
 charx = charx + 20 + random.Next(3);
 PointF drawPoint = new PointF(charx, 0.1F);
 charg.DrawString(checkCode[i].ToString(), fonts[random.Next(fonts.Length)], drawBrush, new PointF(0, 0));//通过特定的几何变换,旋转或变形随机字符,写入前景图
 charg.ResetTransform();
 g.DrawImage(charbmp, drawPoint);
 }
 //画图片的前景噪音点
 for (int i = 0; i < 25; i++)
 {
 int x = random.Next(image.Width);
 int y = random.Next(image.Height);
 image.SetPixel(x, y, Color.FromArgb(random.Next()));
 }
 //画图片的边框线
 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
 //输出
 System.IO.MemoryStream ms = new System.IO.MemoryStream();
 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
 Response.ClearContent();
 Response.ContentType = "image/Gif";
 Response.BinaryWrite(ms.ToArray());
 }
 finally
 {
 g.Dispose();
 image.Dispose();
 }
 }


然后调用此函数即可,原理比较简单,只不过是c#的绘图技巧而已···

转自:http://www.cnblogs.com/dodohua/archive/2011/01/06/1927129.html


0 0
原创粉丝点击