介紹生成兩種類型的圖形驗證碼: 1.普通的隨機字符串; 2.隨機運算表達式
圖形驗證碼類:
/// <summary> /// 圖形驗證碼類 /// </summary> public class PicCaptcha { #region Constructed Methods /// <summary> /// 默認構造方法 /// </summary> public PicCaptcha() { } /// <summary> ///構造方法 /// </summary> /// <param name="cpatchaType">驗證碼類型</param> public PicCaptcha(CaptchaType cpatchaType) { this.CaptchaType = cpatchaType; } /// <summary> /// 構造方法 /// </summary> /// <param name="captchaType">驗證碼類型</param> /// <param name="width">圖形寬度</param> /// <param name="height">圖形高度</param> public PicCaptcha(CaptchaType captchaType, int width, int height) : this(captchaType) { this.Width = width; this.Height = height; } /// <summary> /// 構造方法 /// </summary> /// <param name="captchaType">驗證碼類型</param> /// <param name="width">圖形寬度</param> /// <param name="height">圖形高度</param> /// <param name="fontSize">字體大小</param> public PicCaptcha(CaptchaType captchaType, int width, int height, int fontSize) : this(captchaType, width, height) { this.FontSize = fontSize; } #endregion #region Fields private int _width = 80; //default width private int _height = 25; //default height private int _fontSize = 16; //default fontSize private CaptchaType _captchaType = CaptchaType.RandomType; //default captchaType #endregion #region Properties /// <summary> /// 驗證碼圖形寬度 /// </summary> public int Width { get { return _width; } set { _width = value; } } /// <summary> /// 驗證碼圖形高度 /// </summary> public int Height { get { return _height; } set { _height = value; } } /// <summary> /// 驗證碼字體大小 /// </summary> public int FontSize { get { return _fontSize; } set { _fontSize = value; } } /// <summary> /// 驗證碼類型 /// </summary> public CaptchaType CaptchaType { get { return _captchaType; } set { _captchaType = value; } } #endregion #region Public Methods /// <summary> /// 獲取生成的驗證碼圖片 /// </summary> /// <param name="matchCode">與驗證碼圖片相匹配的內容,一般將該內容保存至session中,用於校驗</param> /// <returns>驗證碼圖片</returns> public Bitmap GetCaptchaPic(out string matchCode) { matchCode = null; string captchaContent = null; switch (_captchaType) //需要生成的驗證碼類型 { case CaptchaType.RandomString: { string randomStr = CreateCheckCodeString(4); captchaContent = randomStr; matchCode = randomStr; break; } case CaptchaType.RandomOperationExpression: { string[] codes = CreateOperateCheckCode(); captchaContent = codes[0]; matchCode = codes[1]; break; } case CaptchaType.RandomType: { RandomSelectCreateMethod(out captchaContent, out matchCode); break; } default: throw new Exception("unknow CaptchaType!"); } return GenerateCaptchaPic(captchaContent); //生成驗證碼圖片 } #endregion #region Private Methods /// <summary> /// 生成驗證碼圖片 /// </summary> /// <param name="captchaContent">驗證碼內容</param> /// <returns>圖片</returns> private Bitmap GenerateCaptchaPic(string captchaContent) { var font = new Font("Arial", _fontSize, FontStyle.Bold);//驗證碼字體 var brush = new SolidBrush(Color.Black);//用於寫驗證碼的畫筆 var crosswise = new Pen(Color.Green, 0);//畫橫向干擾線的鋼筆 var vertical = new Pen(Color.FromArgb(255, 100, 100, 100), 0);//畫縱向干擾線的鋼筆 var image = new Bitmap(_width, _height);//生成圖像 using (Graphics g = Graphics.FromImage(image)) //生成一個繪畫面板(畫布) { g.Clear(ColorTranslator.FromHtml("#f0f0f0"));//用指定顏色填充畫布 RectangleF rect = new RectangleF(5, 2, _width, _height);//定義文字的繪制矩形 Random rand = new Random((int)DateTime.Now.Ticks);//生成干擾線的隨機對象 for (int i = 1; i <= 4; i++) //干擾線 { Point start = new Point(0, rand.Next(_height)); Point end = new Point(_width, rand.Next(_height)); g.DrawLine(crosswise, start, end); } for (int i = 1; i <= 5; i++) //干擾線 { Point start = new Point(rand.Next(_width), 0); Point end = new Point(rand.Next(_width), _height); g.DrawLine(vertical, start, end); } g.DrawString(captchaContent, font, brush, rect);//將驗證碼寫到畫布上 } return image; } /// <summary> /// 隨機選擇生成驗證碼的方法 /// </summary> /// <param name="captchaContent">驗證碼圖片顯示的內容</param> /// <param name="matchCode">與驗證碼圖片匹配的內容</param> private void RandomSelectCreateMethod(out string captchaContent, out string matchCode) { captchaContent = ""; matchCode = ""; int currSeconds = DateTime.Now.Second; if (currSeconds % 2 == 0) { captchaContent = matchCode = CreateCheckCodeString(4); } else { string[] codes = CreateOperateCheckCode(); captchaContent = codes[0]; matchCode = codes[1]; } return; } /// <summary> /// 生成len位隨機字符串 /// </summary> /// <param name="len">隨機字符串長度</param> /// <returns>len位隨機字符串</returns> private string CreateCheckCodeString(int len) { //定義用於驗證碼的字符數組 char[] checkCodeArray ={ '1','2','3','4','5','6','7','8','9','A','B','C', 'D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W', 'X','Y','Z'}; //定義驗證碼字符串 string randomcode = ""; Random rd = new Random(); //生成4位驗證碼字符串 for (int i = 1; i <= len; i++) randomcode += checkCodeArray[rd.Next(checkCodeArray.Length)]; return randomcode; } /// <summary> /// 生成隨機的運算表達式 1+1=?,2 /// </summary> /// <returns>codes[0]: 表達式; codes[1]: 運算結果</returns> private string[] CreateOperateCheckCode() { string[] codes = new string[2] { "", "" }; string[] operators = new string[] { "+", "-" }; int result = 0; Random random = new Random(); int num1 = random.Next(10); // [0,19) int num2 = random.Next(10); string oper = operators[random.Next(operators.Length)]; switch (oper) { case "+": { result = num1 + num2; break; } case "-": { result = num1 - num2; break; } default: throw new Exception("operators error"); } codes[0] = string.Format("{0}{1}{2}=?", num1, oper, num2); codes[1] = result.ToString(); return codes; } #endregion } /// <summary> /// 生成的驗證碼類型 /// </summary> public enum CaptchaType { /// <summary> /// 隨機類型, 在所有支持的驗證碼類型中,隨機選擇一種 /// </summary> RandomType, /// <summary> /// 普通的隨機字符串,如: jH9Y, 12H8 /// </summary> RandomString, /// <summary> /// 隨機運算表達式, 如: 1+2=?, 5加2=?, 4-2=? /// </summary> RandomOperationExpression, }
一般處理程序(.ashx)示例:
/// <summary> /// 生成圖形驗證碼 /// </summary> public class CreateCode : IHttpHandler, IRequiresSessionState { private static readonly string CodeSessionName = "Code_Session_Name"; public void ProcessRequest(HttpContext context) { string checkCodeSession = string.Empty; var captChaPic = new PicCaptcha(); using (var image = captChaPic.GetCaptchaPic(out checkCodeSession)) //獲取驗證碼圖片 using (var ms = new MemoryStream()) { context.Session.Add(CodeSessionName, checkCodeSession); //驗證碼校驗內容保存到sessioin中 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); context.Response.ClearContent(); context.Response.ContentType = "image/Gif"; context.Response.BinaryWrite(ms.ToArray()); } return; } public bool IsReusable { get { return false; } } }
下載: