1 /// <summary>
2 /// 验证码类
3 /// </summary>
4 public class Rand
5 {
6 #region 生成随机数字
7 /// <summary>
8 /// 生成随机数字
9 /// </summary>
10 /// <param name="length">生成长度</param>
11 public static string Number(int Length)
12 {
13 return Number(Length, false);
14 }
15
16 /// <summary>
17 /// 生成随机数字
18 /// </summary>
19 /// <param name="Length">生成长度</param>
20 /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
21 public static string Number(int Length, bool Sleep)
22 {
23 if (Sleep) System.Threading.Thread.Sleep(3);
24 string result = "";
25 System.Random random = new Random();
26 for (int i = 0; i < Length; i++)
27 {
28 result += random.Next(10).ToString();
29 }
30 return result;
31 }
32 #endregion
33
34 #region 生成随机字母与数字
35 /// <summary>
36 /// 生成随机字母与数字
37 /// </summary>
38 /// <param name="IntStr">生成长度</param>
39 public static string Str(int Length)
40 {
41 return Str(Length, false);
42 }
43
44 /// <summary>
45 /// 生成随机字母与数字
46 /// </summary>
47 /// <param name="Length">生成长度</param>
48 /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
49 public static string Str(int Length, bool Sleep)
50 {
51 if (Sleep) System.Threading.Thread.Sleep(3);
52 char[] Pattern = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
53 string result = "";
54 int n = Pattern.Length;
55 System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
56 for (int i = 0; i < Length; i++)
57 {
58 int rnd = random.Next(0, n);
59 result += Pattern[rnd];
60 }
61 return result;
62 }
63 #endregion
64
65 #region 生成随机纯字母随机数
66 /// <summary>
67 /// 生成随机纯字母随机数
68 /// </summary>
69 /// <param name="IntStr">生成长度</param>
70 public static string Str_char(int Length)
71 {
72 return Str_char(Length, false);
73 }
74
75 /// <summary>
76 /// 生成随机纯字母随机数
77 /// </summary>
78 /// <param name="Length">生成长度</param>
79 /// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
80 public static string Str_char(int Length, bool Sleep)
81 {
82 if (Sleep) System.Threading.Thread.Sleep(3);
83 char[] Pattern = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
84 string result = "";
85 int n = Pattern.Length;
86 System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
87 for (int i = 0; i < Length; i++)
88 {
89 int rnd = random.Next(0, n);
90 result += Pattern[rnd];
91 }
92 return result;
93 }
94 #endregion
95 }
96
97 /// <summary>
98 /// 验证图片类
99 /// </summary>
100 public class YZMHelper
101 {
102 #region 私有字段
103 private string text;
104 private Bitmap image;
105 private int letterWidth = 16; //单个字体的宽度范围
106 private int letterHeight = 20; //单个字体的高度范围
107 private static byte[] randb = new byte[4];
108 private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
109 private Font[] fonts =
110 {
111 new Font(new FontFamily("Times New Roman"),10 +Next(1),System.Drawing.FontStyle.Regular),
112 new Font(new FontFamily("Georgia"), 10 + Next(1),System.Drawing.FontStyle.Regular),
113 new Font(new FontFamily("Arial"), 10 + Next(1),System.Drawing.FontStyle.Regular),
114 new Font(new FontFamily("Comic Sans MS"), 10 + Next(1),System.Drawing.FontStyle.Regular)
115 };
116 #endregion
117
118 #region 公有属性
119 /// <summary>
120 /// 验证码
121 /// </summary>
122 public string Text
123 {
124 get { return this.text; }
125 }
126
127 /// <summary>
128 /// 验证码图片
129 /// </summary>
130 public Bitmap Image
131 {
132 get { return this.image; }
133 }
134 #endregion
135
136 #region 构造函数
137 public YZMHelper()
138 {
139 //HttpContext.Current.Response.Expires = 0;
140 //HttpContext.Current.Response.Buffer = true;
141 //HttpContext.Current.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
142 //HttpContext.Current.Response.AddHeader("pragma", "no-cache");
143 //HttpContext.Current.Response.CacheControl = "no-cache";
144 this.text = Rand.Number(4);
145 CreateImage();
146 }
147 #endregion
148
149 #region 私有方法
150 /// <summary>
151 /// 获得下一个随机数
152 /// </summary>
153 /// <param name="max">最大值</param>
154 private static int Next(int max)
155 {
156 rand.GetBytes(randb);
157 int value = BitConverter.ToInt32(randb, 0);
158 value = value % (max + 1);
159 if (value < 0) value = -value;
160 return value;
161 }
162
163 /// <summary>
164 /// 获得下一个随机数
165 /// </summary>
166 /// <param name="min">最小值</param>
167 /// <param name="max">最大值</param>
168 private static int Next(int min, int max)
169 {
170 int value = Next(max - min) + min;
171 return value;
172 }
173 #endregion
174
175 #region 公共方法
176 /// <summary>
177 /// 绘制验证码
178 /// </summary>
179 public void CreateImage()
180 {
181 int int_ImageWidth = this.text.Length * letterWidth;
182 Bitmap image = new Bitmap(int_ImageWidth, letterHeight);
183 Graphics g = Graphics.FromImage(image);
184 g.Clear(Color.White);
185 for (int i = 0; i < 2; i++)
186 {
187 int x1 = Next(image.Width - 1);
188 int x2 = Next(image.Width - 1);
189 int y1 = Next(image.Height - 1);
190 int y2 = Next(image.Height - 1);
191 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
192 }
193 int _x = -12, _y = 0;
194 for (int int_index = 0; int_index < this.text.Length; int_index++)
195 {
196 _x += Next(12, 16);
197 _y = Next(-2, 2);
198 string str_char = this.text.Substring(int_index, 1);
199 str_char = Next(1) == 1 ? str_char.ToLower() : str_char.ToUpper();
200 Brush newBrush = new SolidBrush(GetRandomColor());
201 Point thePos = new Point(_x, _y);
202 g.DrawString(str_char, fonts[Next(fonts.Length - 1)], newBrush, thePos);
203 }
204 for (int i = 0; i < 10; i++)
205 {
206 int x = Next(image.Width - 1);
207 int y = Next(image.Height - 1);
208 image.SetPixel(x, y, Color.FromArgb(Next(0, 255), Next(0, 255), Next(0, 255)));
209 }
210 image = TwistImage(image, true, Next(1, 3), Next(4, 6));
211 g.DrawRectangle(new Pen(Color.LightGray, 1), 0, 0, int_ImageWidth - 1, (letterHeight - 1));
212 this.image = image;
213 }
214
215 /// <summary>
216 /// 字体随机颜色
217 /// </summary>
218 public Color GetRandomColor()
219 {
220 Random RandomNum_First = new Random((int)DateTime.Now.Ticks);
221 System.Threading.Thread.Sleep(RandomNum_First.Next(50));
222 Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);
223 int int_Red = RandomNum_First.Next(180);
224 int int_Green = RandomNum_Sencond.Next(180);
225 int int_Blue = (int_Red + int_Green > 300) ? 0 : 400 - int_Red - int_Green;
226 int_Blue = (int_Blue > 255) ? 255 : int_Blue;
227 return Color.FromArgb(int_Red, int_Green, int_Blue);
228 }
229
230 /// <summary>
231 /// 正弦曲线Wave扭曲图片
232 /// </summary>
233 /// <param name="srcBmp">图片路径</param>
234 /// <param name="bXDir">如果扭曲则选择为True</param>
235 /// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
236 /// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
237 public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
238 {
239 double PI = 6.283185307179586476925286766559;
240 Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
241 Graphics graph = Graphics.FromImage(destBmp);
242 graph.FillRectangle(new SolidBrush(Color.White), 0, 0, destBmp.Width, destBmp.Height);
243 graph.Dispose();
244 double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
245 for (int i = 0; i < destBmp.Width; i++)
246 {
247 for (int j = 0; j < destBmp.Height; j++)
248 {
249 double dx = 0;
250 dx = bXDir ? (PI * (double)j) / dBaseAxisLen : (PI * (double)i) / dBaseAxisLen;
251 dx += dPhase;
252 double dy = Math.Sin(dx);
253 int nOldX = 0, nOldY = 0;
254 nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
255 nOldY = bXDir ? j : j + (int)(dy * dMultValue);
256
257 Color color = srcBmp.GetPixel(i, j);
258 if (nOldX >= 0 && nOldX < destBmp.Width
259 && nOldY >= 0 && nOldY < destBmp.Height)
260 {
261 destBmp.SetPixel(nOldX, nOldY, color);
262 }
263 }
264 }
265 srcBmp.Dispose();
266 return destBmp;
267 }
268 #endregion