首页 > 代码库 > net生成图片验证码--转自Lisliefor

net生成图片验证码--转自Lisliefor

    目前,机器识别验证码已经相当强大了,比较常见的避免被机器识别的方法,就是将验证码的字符串连到一起,这样就加大的识别的难度,毕竟机器没有人工智能。我找了很多的.net生成图片验证码的例子,后来经过一些修改和整理,差不多满足了我的要求:图片有噪音点,每个字符的字体随机,颜色随机,字符部分重叠。

    那么如何实现呢

    1. 首先,验证码图片标签<img>链接到生成图片的aspx页面,如:

   

[c-sharp] view plaincopyprint?
 
  1. <img src=http://www.mamicode.com/"IdentifyingCode.aspx" src=http://www.mamicode.com/"IdentifyingCode.aspx" style="vertical-align:bottom; margin-bottom:1px; cursor: pointer;" style="vertical-align:bottom; margin-bottom:1px; cursor: pointer;" alt="点击刷新" onclick="javascript:var time = new Date().getTime(); this.src=http://www.mamicode.com/this.src + ‘?‘ + time;">   

 

   

    onclick事件的作用在于,点击后,会因为src变化,而重新载入生成图片的页面,以达到更新验证码的效果。

 

    2. 生成图片页面代码,aspx页面不需要添加任何代码,aspx.cs代码,在PageLoad方法中,生成图片。

   

[c-sharp] view plaincopyprint?
 
  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Collections;  
  5. using System.Web;  
  6. using System.Web.Security;  
  7. using System.Web.UI;  
  8. using System.Web.UI.WebControls;  
  9. using System.Web.UI.WebControls.WebParts;  
  10. using System.Web.UI.HtmlControls;  
  11. using System.Drawing;  
  12. using System.Drawing.Imaging;  
  13. using System.IO;  
  14.   
  15.   
  16. namespace ATA.OLSD.OrgMng.WebSite  
  17. {  
  18.     public partial class IdentifyingCode : System.Web.UI.Page  
  19.     {  
  20.         private void Page_Load(object sender, System.EventArgs e)  
  21.         {  
  22.             string randomcode = this.CreateRandomCode(4);  
  23.             Response.Cookies.Add(new HttpCookie("CheckCode", randomcode));  
  24.             //ViewState["ValidateCode"]  =  randomcode; // Session、Cookie、ViewState都可保存,根据实际情况定  
  25.             this.CreateImage(randomcode);  
  26.   
  27.         }  
  28.   
  29.         ///  <summary>  
  30.         ///  生成随机码  
  31.         ///  </summary>  
  32.         ///  <param  name="length">随机码个数</param>  
  33.         ///  <returns></returns>  
  34.         private string CreateRandomCode(int length)  
  35.         {  
  36.             int rand;  
  37.             char code;  
  38.             string randomcode = String.Empty;  
  39.   
  40.             //生成一定长度的验证码  
  41.             System.Random random = new Random();  
  42.             for (int i = 0; i < length; i++)  
  43.             {  
  44.                 rand = random.Next();  
  45.   
  46.                 if (rand % 3 == 0)  
  47.                 {  
  48.                     code = (char)(‘A‘ + (char)(rand % 26));  
  49.                 }  
  50.                 else  
  51.                 {  
  52.                     code = (char)(‘0‘ + (char)(rand % 10));  
  53.                 }  
  54.   
  55.                 randomcode += code.ToString();  
  56.             }  
  57.             return randomcode;  
  58.         }  
  59.   
  60.         ///  <summary>  
  61.         ///  创建随机码图片  
  62.         ///  </summary>  
  63.         ///  <param  name="randomcode">随机码</param>  
  64.         private void CreateImage(string randomcode)  
  65.         {  
  66.             int randAngle = 45;     //随机转动角度  
  67.             int mapwidth = (int)(randomcode.Length * 16);  
  68.             Bitmap map = new Bitmap(mapwidth, 28);  //创建图片背景,设置其长宽  
  69.             Graphics graph = Graphics.FromImage(map);  
  70.             graph.Clear(Color.AliceBlue);  
  71.             graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框  
  72.   
  73.             Random rand = new Random();  
  74.   
  75.             // 生成背景噪点  
  76.             Pen blackPen = new Pen(Color.LightGray, 0);  
  77.             for (int i = 0; i < 50; i++)  
  78.             {  
  79.                 int x = rand.Next(0, map.Width);  
  80.                 int y = rand.Next(0, map.Height);  
  81.                 graph.DrawRectangle(blackPen, x, y, 1, 1);  
  82.             }  
  83.   
  84.             //验证码旋转,防止机器识别  
  85.             char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组  
  86.   
  87.             //文字距中  
  88.             StringFormat format = new StringFormat(StringFormatFlags.NoClip);  
  89.             format.Alignment = StringAlignment.Center;  
  90.             format.LineAlignment = StringAlignment.Center;  
  91.   
  92.             // 定义随机颜色列表  
  93.             Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };  
  94.             // 定义随机字体字体  
  95.             string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };  
  96.   
  97.             for (int i = 0; i < chars.Length; i++)  
  98.             {  
  99.                 int cindex = rand.Next(7);  
  100.                 int findex = rand.Next(5);  
  101.   
  102.                 Font f = new System.Drawing.Font(font[findex], 16, System.Drawing.FontStyle.Bold); // 字体样式(参数2为字体大小)  
  103.                 Brush b = new System.Drawing.SolidBrush(c[cindex]);  
  104.   
  105.                 Point dot = new Point(11, 11);  // 括号内数值越大,字符间距越大  
  106.                 float angle = rand.Next(0, randAngle);  // 转动的度数,如果将0改为-randAngle,那么旋转角度为-45度~45度  
  107.   
  108.                 graph.TranslateTransform(dot.X, dot.Y);  
  109.                 graph.RotateTransform(angle);  
  110.                 graph.DrawString(chars[i].ToString(), f, b, 2, 6, format); // 第4、5个参数控制左、上间距  
  111.                 graph.RotateTransform(-angle);  
  112.                 graph.TranslateTransform(2, -dot.Y);  
  113.             }  
  114.   
  115.             //生成图片  
  116.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  117.             map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);  
  118.             Response.ClearContent();  
  119.             Response.ContentType = "image/gif";  
  120.             Response.BinaryWrite(ms.ToArray());  
  121.             graph.Dispose();  
  122.             map.Dispose();  
  123.         }  
  124.   
  125.     }  
  126. }  

 

 

    可根据其中注释来修改验证码的字符大小、旋转角度、字体、颜色等等。每次重新加载该页面,将会得到新的验证码,并保存在session或cookie中,校验时,从session或cookie中读取即可。

    效果如下图所示:

    验证码效果图

    可点击刷新。

net生成图片验证码--转自Lisliefor