ChaosSea验证码0.20版
功能说明:
1. 可自定义字体
2. 可自定义最大字号
3. 可自定义随机旋转的角度
4. 可自定义前景随机噪色量
5. 可外部生成随机码,由VerifyCode类处理成图片
6. 可自定义数字与英文字母随机出现的比率
7. 可自定义验证码长度
8. 可自定义验证码背景色
9. 可自定义验证码色彩(噪点色同验证码色一致)
10. 可自定义字体
------------------------------
本人觉得用上随机角度就行了,不用前景噪点,因为这个东东会耗一定的资源
1
using
System;
2 using System.Collections.Generic;
3 using System.Web;
4 using System.Web.UI;
5 using System.Web.UI.WebControls;
6 using System.Web.UI.WebControls.WebParts;
7 using System.Web.UI.HtmlControls;
8
9 using System.IO;
10 using System.Drawing;
11
12
13 namespace CS.Common.Utility
14 {
15 ///
16 /// Chaos验证码
17 /// FileName : VerifyCode.cs
18 /// Verion : 0.20
19 /// Author : zhouyu http://max.cszi.com
20 /// Update : 2007-10-10
21 /// Description : 验证码随机旋转一定角度,可使用前景色,背景色效果不大就不用了
22 ///
23 public class VerifyCode
24 {
25
26 private int _length = 4; //验证码长度
27 private int _fontSize = 18; //字体最大尺寸
28 private int _border = 0; //边框,0时没有连框
29 private Color _backgroundColor = Color.AliceBlue; //背景色
30 private Color _fontColor = Color.Blue; //验证码色
31 private int _rateNumber = 10; //验证码中的数字出现机率 ,越大出现的数字机率越大
32 private string _randomChars; //随机生成的验证码
33 private int _randomAngle = 40; //随机码的旋转角度
34 private string _fontFamily = "Verdana"; //字体
35 private int _chaosNumber = 0; //噪点数量 ,0 时不用
36
37 private Random random = new Random(); //随机种子,公用
38
39 public VerifyCode()
40 {
41
42 }
43
44 ///
45 /// 重载一 :噪点
46 ///
47 ///
48 public VerifyCode(int chaosNumber)
49 {
50 _chaosNumber = chaosNumber;
51 }
52
53 ///
54 /// 重载二:长度,噪点
55 ///
56 ///
57 ///
58 public VerifyCode(int length, int chaosNumber)
59 {
60 _length = length;
61 _chaosNumber = chaosNumber;
62 }
63
64 ///
65 /// 重载三:长度,噪点,数字机率
66 ///
67 ///
68 ///
69 /// 越大,生成的随机码中数字占的比例越多
70 public VerifyCode(int length, int chaosNumber, int rate)
71 {
72 _length = length;
73 _chaosNumber = chaosNumber;
74 _rateNumber = rate;
75 }
76
77
78 .Length 验证码长度(默认4个)
85
86 .FontSize 字体最大尺寸(默认18)
93
94 .Border 边框(默认0 没有连框)
101
102 .BackgroundColor 自定义背景色(默认Color.AliceBlue)
109
110 .FontColor 验证码色(默认Color.Blue)
117
118 .RandomCode 随机生成的验证码
125
126 .RateNumber 验证码中的数字出现机率,越大出现的数字机率越大(默认10)
133
134 .RandomAngle 随机码的旋转角度(默认40度)
141
142 .FontFamily 字体
149
150 .ChaosNumber 噪点数量(默认值为2)
157
158
159
160 ///
161 /// 生成随机验证码
162 ///
163 private void CreateCode()
164 {
165 //有外部输入验证码时不用产生,否则随机生成
166 if (!string.IsNullOrEmpty(_randomChars))
167 { return; }
168
169 char code;
170 for (int i = 0; i < _length; i++)
171 {
172 int rand = random.Next();
173 if (rand % _rateNumber == 0)
174 { code = (char)('A' + (char)(rand % 26)); }
175 else
176 { code = (char)('0' + (char)(rand % 10)); }
177 _randomChars += code.ToString();
178 }
179 }
180
181
182 ///
183 /// 背景噪点生成
184 ///
185 ///
186 private void CreateBackgroundChaos(Bitmap map,Graphics graph)
187 {
188 Pen blackPen = new Pen(Color.Azure, 0);
189 for (int i = 0; i < map.Width * 2; i++)
190 {
191 int x = random.Next(map.Width);
192 int y = random.Next(map.Height);
193 graph.DrawRectangle(blackPen, x, y, 1, 1);
194 }
195 }
196
197 ///
198 /// 前景色噪点
199 ///
200 ///
201 private void CreaetForeChaos(Bitmap map)
202 {
203 for (int i = 0; i < map.Width * _chaosNumber; i++)
204 {
205 int x = random.Next(map.Width);
206 int y = random.Next(map.Height);
207 //map.SetPixel(x, y, Color.FromArgb(random.Next(300)));
208 map.SetPixel(x, y, _fontColor);
209 }
210 }
211
212
213 ///
214 /// 创建随机码图片
215 ///
216 ///
217 public void CreateImage(HttpContext context)
218 {
219 CreateCode(); //创建验证码
220
221 Bitmap map = new Bitmap((int)(_randomChars.Length * 15), 24); //创建图片背景
222 Graphics graph = Graphics.FromImage(map);
223 //graph.FillRectangle(new SolidBrush(Color.Black), 0, 0, map.Width+1, map.Height+1); //填充一个有背景的矩形
224
225 //if (_border > 0) //画一个边框
226 //{
227 // graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - _border, map.Height - _border);
228 //}
229 //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //模式
230
231 graph.Clear(_backgroundColor); //清除画面,填充背景
232 SolidBrush brush = new SolidBrush(_fontColor); //画笔
233 Point dot = new Point(12, 12);
234
235 //CreateBackgroundChaos(map,graph); //背景噪点生成
236
237 CreaetForeChaos(map); //前景色噪点
238
239 //文字距中
240 StringFormat format = new StringFormat(StringFormatFlags.NoClip);
241 format.Alignment = StringAlignment.Center;
242 format.LineAlignment = StringAlignment.Center;
243
244 //验证码旋转,防止机器识别
245 char[] chars = _randomChars.ToCharArray(); //拆散字符串成单字符数组
246 for (int i = 0; i < chars.Length; i++)
247 {
248 Font fontstyle = new Font(_fontFamily, random.Next(_fontSize - 3, _fontSize), FontStyle.Regular); //字体样式
249 float angle = random.Next(-_randomAngle, _randomAngle); //转动的度数
250
251 graph.TranslateTransform(dot.X, dot.Y); //移动光标到指定位置
252 graph.RotateTransform(angle);
253 graph.DrawString(chars[i].ToString(), fontstyle, brush, -2, 2, format);
254 graph.RotateTransform(-angle); //转回去
255 graph.TranslateTransform(2, -dot.Y); //移动光标到指定位置
256 }
257
258
259 //生成图片
260 MemoryStream ms = new MemoryStream();
261 map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
262 context.Response.ClearContent();
263 context.Response.ContentType = "image/gif";
264 context.Response.BinaryWrite(ms.ToArray());
265 graph.Dispose();
266 map.Dispose();
267
268 }
269
270
271
272
273
274 }
275
276
277
278}
279
2 using System.Collections.Generic;
3 using System.Web;
4 using System.Web.UI;
5 using System.Web.UI.WebControls;
6 using System.Web.UI.WebControls.WebParts;
7 using System.Web.UI.HtmlControls;
8
9 using System.IO;
10 using System.Drawing;
11
12
13 namespace CS.Common.Utility
14 {
15 ///
16 /// Chaos验证码
17 /// FileName : VerifyCode.cs
18 /// Verion : 0.20
19 /// Author : zhouyu http://max.cszi.com
20 /// Update : 2007-10-10
21 /// Description : 验证码随机旋转一定角度,可使用前景色,背景色效果不大就不用了
22 ///
23 public class VerifyCode
24 {
25
26 private int _length = 4; //验证码长度
27 private int _fontSize = 18; //字体最大尺寸
28 private int _border = 0; //边框,0时没有连框
29 private Color _backgroundColor = Color.AliceBlue; //背景色
30 private Color _fontColor = Color.Blue; //验证码色
31 private int _rateNumber = 10; //验证码中的数字出现机率 ,越大出现的数字机率越大
32 private string _randomChars; //随机生成的验证码
33 private int _randomAngle = 40; //随机码的旋转角度
34 private string _fontFamily = "Verdana"; //字体
35 private int _chaosNumber = 0; //噪点数量 ,0 时不用
36
37 private Random random = new Random(); //随机种子,公用
38
39 public VerifyCode()
40 {
41
42 }
43
44 ///
45 /// 重载一 :噪点
46 ///
47 ///
48 public VerifyCode(int chaosNumber)
49 {
50 _chaosNumber = chaosNumber;
51 }
52
53 ///
54 /// 重载二:长度,噪点
55 ///
56 ///
57 ///
58 public VerifyCode(int length, int chaosNumber)
59 {
60 _length = length;
61 _chaosNumber = chaosNumber;
62 }
63
64 ///
65 /// 重载三:长度,噪点,数字机率
66 ///
67 ///
68 ///
69 /// 越大,生成的随机码中数字占的比例越多
70 public VerifyCode(int length, int chaosNumber, int rate)
71 {
72 _length = length;
73 _chaosNumber = chaosNumber;
74 _rateNumber = rate;
75 }
76
77
78 .Length 验证码长度(默认4个)
85
86 .FontSize 字体最大尺寸(默认18)
93
94 .Border 边框(默认0 没有连框)
101
102 .BackgroundColor 自定义背景色(默认Color.AliceBlue)
109
110 .FontColor 验证码色(默认Color.Blue)
117
118 .RandomCode 随机生成的验证码
125
126 .RateNumber 验证码中的数字出现机率,越大出现的数字机率越大(默认10)
133
134 .RandomAngle 随机码的旋转角度(默认40度)
141
142 .FontFamily 字体
149
150 .ChaosNumber 噪点数量(默认值为2)
157
158
159
160 ///
161 /// 生成随机验证码
162 ///
163 private void CreateCode()
164 {
165 //有外部输入验证码时不用产生,否则随机生成
166 if (!string.IsNullOrEmpty(_randomChars))
167 { return; }
168
169 char code;
170 for (int i = 0; i < _length; i++)
171 {
172 int rand = random.Next();
173 if (rand % _rateNumber == 0)
174 { code = (char)('A' + (char)(rand % 26)); }
175 else
176 { code = (char)('0' + (char)(rand % 10)); }
177 _randomChars += code.ToString();
178 }
179 }
180
181
182 ///
183 /// 背景噪点生成
184 ///
185 ///
186 private void CreateBackgroundChaos(Bitmap map,Graphics graph)
187 {
188 Pen blackPen = new Pen(Color.Azure, 0);
189 for (int i = 0; i < map.Width * 2; i++)
190 {
191 int x = random.Next(map.Width);
192 int y = random.Next(map.Height);
193 graph.DrawRectangle(blackPen, x, y, 1, 1);
194 }
195 }
196
197 ///
198 /// 前景色噪点
199 ///
200 ///
201 private void CreaetForeChaos(Bitmap map)
202 {
203 for (int i = 0; i < map.Width * _chaosNumber; i++)
204 {
205 int x = random.Next(map.Width);
206 int y = random.Next(map.Height);
207 //map.SetPixel(x, y, Color.FromArgb(random.Next(300)));
208 map.SetPixel(x, y, _fontColor);
209 }
210 }
211
212
213 ///
214 /// 创建随机码图片
215 ///
216 ///
217 public void CreateImage(HttpContext context)
218 {
219 CreateCode(); //创建验证码
220
221 Bitmap map = new Bitmap((int)(_randomChars.Length * 15), 24); //创建图片背景
222 Graphics graph = Graphics.FromImage(map);
223 //graph.FillRectangle(new SolidBrush(Color.Black), 0, 0, map.Width+1, map.Height+1); //填充一个有背景的矩形
224
225 //if (_border > 0) //画一个边框
226 //{
227 // graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - _border, map.Height - _border);
228 //}
229 //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //模式
230
231 graph.Clear(_backgroundColor); //清除画面,填充背景
232 SolidBrush brush = new SolidBrush(_fontColor); //画笔
233 Point dot = new Point(12, 12);
234
235 //CreateBackgroundChaos(map,graph); //背景噪点生成
236
237 CreaetForeChaos(map); //前景色噪点
238
239 //文字距中
240 StringFormat format = new StringFormat(StringFormatFlags.NoClip);
241 format.Alignment = StringAlignment.Center;
242 format.LineAlignment = StringAlignment.Center;
243
244 //验证码旋转,防止机器识别
245 char[] chars = _randomChars.ToCharArray(); //拆散字符串成单字符数组
246 for (int i = 0; i < chars.Length; i++)
247 {
248 Font fontstyle = new Font(_fontFamily, random.Next(_fontSize - 3, _fontSize), FontStyle.Regular); //字体样式
249 float angle = random.Next(-_randomAngle, _randomAngle); //转动的度数
250
251 graph.TranslateTransform(dot.X, dot.Y); //移动光标到指定位置
252 graph.RotateTransform(angle);
253 graph.DrawString(chars[i].ToString(), fontstyle, brush, -2, 2, format);
254 graph.RotateTransform(-angle); //转回去
255 graph.TranslateTransform(2, -dot.Y); //移动光标到指定位置
256 }
257
258
259 //生成图片
260 MemoryStream ms = new MemoryStream();
261 map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
262 context.Response.ClearContent();
263 context.Response.ContentType = "image/gif";
264 context.Response.BinaryWrite(ms.ToArray());
265 graph.Dispose();
266 map.Dispose();
267
268 }
269
270
271
272
273
274 }
275
276
277
278}
279
使用方法:
using
System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CS.Common.Utility;
namespace Test
{
public partial class Vcode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
VerifyCode vcode = new VerifyCode();
vcode.CreateImage(base.Context);
Session["VerifyCode"] = vcode.RandomCode;
}
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CS.Common.Utility;
namespace Test
{
public partial class Vcode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
VerifyCode vcode = new VerifyCode();
vcode.CreateImage(base.Context);
Session["VerifyCode"] = vcode.RandomCode;
}
}
}
下载地址:源文件:
点击下载文件