1 using System;
2 using System.Collections.Generic;
3 using System.Drawing;
4 using System.Drawing.Drawing2D;
5 using System.Drawing.Imaging;
6 using System.IO;
7 using System.Linq;
8 using System.Web;
9
10
11 public class ValidateCode
12 {
13 public ValidateCode()
14 {
15 }
16 /// <summary>
17 /// 验证码的最大长度
18 /// </summary>
19 public int MaxLength
20 {
21 get { return 10; }
22 }
23 /// <summary>
24 /// 验证码的最小长度
25 /// </summary>
26 public int MinLength
27 {
28 get { return 1; }
29 }
30 /// <summary>
31 /// 生成验证码
32 /// </summary>
33 /// <param name="length">指定验证码的长度</param>
34 /// <returns></returns>
35 public string CreateValidateCode(int length)
36 {
37 int[] randMembers = new int[length];
38 int[] validateNums = new int[length];
39 string validateNumberStr = "";
40 //生成起始序列值
41 int seekSeek = unchecked((int)DateTime.Now.Ticks);
42 Random seekRand = new Random(seekSeek);
43 int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
44 int[] seeks = new int[length];
45 for (int i = 0; i < length; i++)
46 {
47 beginSeek += 10000;
48 seeks[i] = beginSeek;
49 }
50 //生成随机数字
51 for (int i = 0; i < length; i++)
52 {
53 Random rand = new Random(seeks[i]);
54 int pownum = 1 * (int)Math.Pow(10, length);
55 randMembers[i] = rand.Next(pownum, Int32.MaxValue);
56 }
57 //抽取随机数字
58 for (int i = 0; i < length; i++)
59 {
60 string numStr = randMembers[i].ToString();
61 int numLength = numStr.Length;
62 Random rand = new Random();
63 int numPosition = rand.Next(0, numLength - 1);
64 validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
65 }
66 //生成验证码
67 for (int i = 0; i < length; i++)
68 {
69 validateNumberStr += validateNums[i].ToString();
70 }
71 return validateNumberStr;
72 }
73 /// <summary>
74 /// 创建验证码的图片
75 /// </summary>
76 /// <param name="containsPage">要输出到的page对象</param>
77 /// <param name="validateNum">验证码</param>
78 public void CreateValidateGraphic(string validateCode,HttpContext context)
79 {
80 Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
81 Graphics g = Graphics.FromImage(image);
82 try
83 {
84 //生成随机生成器
85 Random random = new Random();
86 //清空图片背景色
87 g.Clear(Color.White);
88 //画图片的干扰线
89 for (int i = 0; i < 25; i++)
90 {
91 int x1 = random.Next(image.Width);
92 int x2 = random.Next(image.Width);
93 int y1 = random.Next(image.Height);
94 int y2 = random.Next(image.Height);
95 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
96 }
97 Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
98 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
99 Color.Blue, Color.DarkRed, 1.2f, true);
100 g.DrawString(validateCode, font, brush, 3, 2);
101 //画图片的前景干扰点
102 for (int i = 0; i < 100; i++)
103 {
104 int x = random.Next(image.Width);
105 int y = random.Next(image.Height);
106 image.SetPixel(x, y, Color.FromArgb(random.Next()));
107 }
108 //画图片的边框线
109 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
110 //保存图片数据
111 MemoryStream stream = new MemoryStream();
112 image.Save(stream, ImageFormat.Jpeg);
113 //输出图片流
114 context.Response.Clear();
115 context.Response.ContentType = "image/jpeg";
116 context.Response.BinaryWrite(stream.ToArray());
117 }
118 finally
119 {
120 g.Dispose();
121 image.Dispose();
122 }
123 }
124 /// <summary>
125 /// 得到验证码图片的长度
126 /// </summary>
127 /// <param name="validateNumLength">验证码的长度</param>
128 /// <returns></returns>
129 public static int GetImageWidth(int validateNumLength)
130 {
131 return (int)(validateNumLength * 12.0);
132 }
133 /// <summary>
134 /// 得到验证码的高度
135 /// </summary>
136 /// <returns></returns>
137 public static double GetImageHeight()
138 {
139 return 22.5;
140 }
141 }