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