验证码类(转)
?
這些東西網上都泛濫了,隨便拉了個過來,然后改改,加上自己的標示什么的,就是這樣子了。可以定義驗證碼的格式,包括字母、數字、特殊符號和漢字,指定生成的圖片大小。
本來還想加上圖片扭曲的,可怕以后用起來被人說“萬惡的驗證碼”所以就算了。
? 1using?System;
??2using?System.Collections;
??3using?System.Collections.Generic;
??4using?System.Drawing;
??5using?System.Text;
??6using?System.Threading;
??7using?System.Drawing.Drawing2D;
??8
??9namespace?SHNK.Framework.Utility
?10{
?11????/**////?<summary>
?12????///?驗證碼生成類
?13????///?</summary>
?14????public?static?class?ValidateCodeHelper
?15????{
?16????????/**////?<summary>
?17????????///?生成長度為length、字符類型為codeType的驗證碼字符串
?18????????///?</summary>
?19????????///?<param?name="codeType">驗證碼類型</param>
?20????????///?<param?name="length">驗證碼長度</param>
?21????????///?<returns>驗證碼字符串</returns>
?22????????public?static?string?GenerateCode(ValidateCodeType?codeType,?int?length)
?23????????{
?24
?25????????????const?string?sNumber?=?"0123456789";
?26????????????const?string?sLetter?=?"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
?27????????????const?string?sSymbol?=?"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
?28
?29????????????if?((codeType?|?ValidateCodeType.Chinese)?==?codeType)
?30????????????{
?31????????????????return?GetChinese(length);
?32????????????}
?33
?34????????????StringBuilder?blocks?=?new?StringBuilder();
?35????????????StringBuilder?builder?=?new?StringBuilder();
?36
?37????????????if?((codeType?|?ValidateCodeType.Number)?==?codeType)
?38????????????????blocks.Append(sNumber);
?39
?40????????????if?((codeType?|?ValidateCodeType.Letter)?==?codeType)
?41????????????????blocks.Append(sLetter);
?42
?43????????????if?((codeType?|?ValidateCodeType.Symbol)?==?codeType)
?44????????????????blocks.Append(sSymbol);
?45
?46????????????Random?rand?=?new?Random();
?47????????????for?(int?i?=?0;?i?<?length;?i++)
?48????????????{
?49????????????????builder.Append(blocks[rand.Next(blocks.Length)]);
?50????????????}
?51
?52????????????return?builder.ToString();
?53????????}
?54
?55????????/**////?<summary>
?56????????///?獲取num個中文字符
?57????????///?</summary>
?58????????///?<param?name="num">字符串長度</param>
?59????????///?<returns>中文字符</returns>
?60????????private?static?string?GetChinese(int?num)
?61????????{
?62????????????/**//*?*********************************************
?63?????????????*?be?in?common?use
?64?????????????*?
?65?????????????*?first?byte???????0xB0?-?0xD7
?66?????????????*?second?byte??????0xA1?-?0xFE
?67?????????????*?
?68?????????????*??????????except??0xD7FA?-?0xD7FE?(space)
?69?????????????*?*********************************************/
?70????????????const?int?_MAX_SIZE?=?3755;?//??(0xD7?-?0xB0?+?1)?*?(0xFE?-?0xA1?+?1)?-?(0xD7FE?-?0xD7FA?+?1);
?71????????????const?int?_Capacity?=?94;???//??0xFE?-?0xA1?+?1
?72
?73????????????Random?rand?=?new?Random();
?74????????????StringBuilder?builder?=?new?StringBuilder();
?75????????????for?(int?i?=?0;?i?<?num;?i++)
?76????????????{
?77????????????????int?index?=?rand.Next(_MAX_SIZE);
?78????????????????int?high?=?Math.Floor(index.ToDouble()?/?_Capacity.ToDouble()).ToInt32();
?79????????????????int?lower?=?index?%?_Capacity;
?80????????????????string?code?=?Encoding.Default.GetString(new?byte[]?{?(byte)(high?+?0xB0),?(byte)(lower?+?0xA1)?});
?81????????????????builder.Append(code);
?82????????????}
?83????????????return?builder.ToString();
?84????????}
?85
?86????????/**////?<summary>
?87????????///?按照輸入的字符串src和每個字符位圖的寬度生成一張圖片
?88????????///?</summary>
?89????????///?<param?name="src">驗證碼</param>
?90????????///?<param?name="height">圖片高度</param>
?91????????///?<param?name="wdpc">每個字符所占寬度</param>
?92????????///?<returns>驗證圖片</returns>
?93????????public?static?Image?GenerateImage(string?src,?int?height,?int?wdpc)
?94????????{
?95????????????Bitmap?img?=?new?Bitmap(src.Length?*?wdpc,?height);
?96????????????Graphics?g?=?Graphics.FromImage(img);
?97????????????g.Clear(Color.White);
?98
?99????????????Random?rand?=?new?Random();
100????????????for?(int?i?=?0;?i?<?25;?i++)
101????????????{
102????????????????int?x1?=?rand.Next(img.Width);
103????????????????int?x2?=?rand.Next(img.Width);
104????????????????int?y1?=?rand.Next(img.Height);
105????????????????int?y2?=?rand.Next(img.Height);
106
107????????????????g.DrawLine(new?Pen(Color.Silver),?x1,?y1,?x2,?y2);
108????????????}
109????????????Font?f?=?new?Font("'Segoe?UI'?微軟雅黑?Verdana?宋體",?14f);
110????????????Brush?b?=?new?LinearGradientBrush(new?Rectangle(new?Point(0,?0),?img.Size),?Color.Blue,?Color.DarkRed,?LinearGradientMode.ForwardDiagonal);
111????????????for?(int?i?=?0;?i?<?src.Length;?i++)
112????????????????g.DrawString(src[i].ToString(),?f,?b,?wdpc?*?i.ToSingle(),?0f);
113
114????????????g.Save();
115????????????for?(int?i?=?0;?i?<?100;?i++)
116????????????{
117????????????????int?x?=?rand.Next(img.Width);
118????????????????int?y?=?rand.Next(img.Height);
119
120????????????????img.SetPixel(x,?y,?Color.FromArgb(rand.Next()));
121????????????}
122
123????????????return?img;
124????????}
125????}
126
127????ValidateCodeType?Enum#region?ValidateCodeType?Enum
128????/**////?<summary>
129????///?驗證碼類型枚舉
130????///?</summary>
131????public?enum?ValidateCodeType
132????{
133????????/**//*??ValidateCodeType枚舉成員?????????????????????????????????????
134?????????*??
135?????????*??????Number:
136?????????*????????ASCII?Code?48?-?57
137?????????*????????
138?????????*??????Letter:
139?????????*????????Uppercase
140?????????*??????????ASCII?Code?65?-?90
141?????????*????????Lowercase
142?????????*??????????ASCII?Code?97?-?122
143?????????*??????
144?????????*??????Symbol:
145?????????*??????????ASCII?Code?33?-?126?except?Number?and?Letter
146?????????*??????????
147?????????*??????Chinese:
148?????????*??????????Unicode?0xA1A1-0xF7FE
149?????????*/
150????????/**////?<summary>
151????????///?數字
152????????///?</summary>
153????????Number?=?1,
154????????/**////?<summary>
155????????///?字母
156????????///?</summary>
157????????Letter?=?2,
158????????/**////?<summary>
159????????///?符號
160????????///?</summary>
161????????Symbol?=?4,
162????????/**////?<summary>
163????????///?漢字
164????????///?</summary>
165????????Chinese?=?8
166????}
167????#endregion
168
169????public?static?partial?class?Extension
170????{
171????????convert?method#region?convert?method
172????????public?static?double?ToDouble(this?IConvertible?o)
173????????{
174????????????return?Convert.ToDouble(o);
175????????}
176
177????????public?static?int?ToInt32(this?IConvertible?o)
178????????{
179????????????return?Convert.ToInt32(o);
180????????}
181
182????????public?static?float?ToSingle(this?IConvertible?o)
183????????{
184????????????return?Convert.ToSingle(o);
185????????}
186????????#endregion
187????}
188}
轉載于:https://www.cnblogs.com/HappyQQ/archive/2008/04/16/1155945.html
總結
- 上一篇: 乐在其中设计模式(C#)系列文章索引
- 下一篇: 皮肤的实时3S渲染(OpenGL + G