目前,許多網站的會員登入時都要求輸入驗證碼,儘管驗證碼的形式五花八門,但是所使用的原理基本是一樣的,都是產生隨機字串,然後描繪成圖片的形式輸出。
驗證碼的生產主要分兩部分:1是隨機字串的產生;2是生產驗證碼圖片
1 隨機字串的產生:
隨機字串產生有很多方法,這裡介紹一種利用字元數組生產隨機串的方法
代碼1所示,自訂自己的隨機字元數組,然後使用隨機函數隨機抽取4個字元組成一個隨機字串
/// <summary> /// 產生隨機字串 /// </summary> /// <returns></returns> private string GenerateCheckCode() { // PageUtils.VerifyCode = checkCode.ToLower(); //自訂自己驗證碼需要顯示的字元 //如果僅僅是數字和26個字母,您可以寫一個迴圈遍曆 char[] myCodeChar = { '1', '2', '3', '4', '5', 'a', 'b', 'c', 'd', 'e', 'f' }; int number; char code; string checkCode = string.Empty; //使用隨機函數,產生一個隨機數 System.Random random = new Random(); for (int i = 0; i < 4; i++) { number = random.Next(myCodeChar.Length); code = (char)(myCodeChar[number]); checkCode += code.ToString(); } Session["checkCode"] = checkCode.ToLower();//把產生的驗證碼存入session return checkCode; }
圖1
2 生產驗證碼圖片,其實就是用c#的Graphics把產生德隨機串描繪到圖片上,具體請看圖2代碼示意:
/// <summary> /// 產生驗證碼圖片,並輸出 /// </summary> /// <param name="checkCode"></param> private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; Matrix m = new Matrix();//定義幾何變換 Bitmap charbmp = new Bitmap(90, 30);//圖片前景色彩,即產生背景透明的隨機字串圖片 //定義字型 Font[] fonts = { new Font(new FontFamily("Times New Roman"), 17, FontStyle.Regular), new Font(new FontFamily("Georgia"), 17, FontStyle.Regular), new Font(new FontFamily("Arial"), 17, FontStyle.Regular), new Font(new FontFamily("Comic Sans MS"), 17, FontStyle.Regular) }; //定義圖片背景色 System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 22.5)), 30); //開始描繪 Graphics g = Graphics.FromImage(image); g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed; //定義背景色為白色 g.Clear(Color.White); try { Random random = new Random();//產生隨機產生器 g.Clear(Color.White);//清空圖片背景色 for (int i = 0; i < 2; i++)//畫圖片的背景雜音線,i表示畫多少條噪音線 { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Black), x1, y1, x2, y2); } //開始描繪前景圖 Graphics charg = Graphics.FromImage(charbmp); SolidBrush drawBrush = new SolidBrush(Color.FromArgb(random.Next(101), random.Next(101), random.Next(101))); float charx = -18; //把隨機字串,逐個寫入前景圖 for (int i = 0; i < checkCode.Length; i++) { m.Reset(); m.RotateAt(random.Next(31) - 25, new PointF(random.Next(4) + 7, random.Next(4) + 7)); charg.Clear(Color.Transparent);//定義前景圖為透明 charg.Transform = m; //定義前景色彩為黑色 drawBrush.Color = Color.Black; charx = charx + 20 + random.Next(3); PointF drawPoint = new PointF(charx, 0.1F); charg.DrawString(checkCode[i].ToString(), fonts[random.Next(fonts.Length)], drawBrush, new PointF(0, 0));//通過特定的幾何變換,旋轉或變形隨機字元,寫入前景圖 charg.ResetTransform(); g.DrawImage(charbmp, drawPoint); } //畫圖片的前景噪音點 for (int i = 0; i < 25; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //輸出 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } }
圖2
然後調用此函數即可,原理比較簡單,只不過是c#的繪圖技巧而已···