C#写的较完美验证码通用类

  1. using System;
  2. using System.Collections;   
  3. using System.ComponentModel;   
  4. using System.Data;   
  5. using System.Drawing;   
  6. using System.Web;   
  7. using System.Web.SessionState;   
  8. using System.Web.UI;   
  9. using System.Web.UI.WebControls;   
  10. using System.Web.UI.HtmlControls;   
  11. namespace WebApplication1.验证码   
  12. {   
  13. ///  <summary>   
  14. ///  完美随机验证码  0.10   
  15. ///  Verion:0.10   
  16. ///  Description:随机生成设定验证码,并随机旋转一定角度,字体颜色不同   
  17. ///  </summary>   
  18. public class ValidateCode : System.Web.UI.Page   
  19. {   
  20. private void Page_Load(object sender, System.EventArgs e)   
  21. {   
  22. string  randomcode  =  this.CreateRandomCode(4);   
  23. Session["ValidateCode"]  =  randomcode;   
  24. //ViewState["ValidateCode"]  =  randomcode;   
  25. this.CreateImage(randomcode);   
  26. }   
  27. ///  <summary>   
  28. ///  生成随机码   
  29. ///  </summary>   
  30. ///  <param  name="length">随机码个数</param>   
  31. ///  <returns></returns>   
  32. private  string  CreateRandomCode(int length)   
  33. {   
  34. int rand;   
  35. char code;   
  36. string randomcode = String.Empty;   
  37. //生成一定长度的验证码   
  38. System.Random random = new Random();   
  39. for(int i=0;i<length;i++)   
  40. {   
  41. rand = random.Next();   
  42. if(rand%3 == 0)   
  43. {   
  44. code = (char)('A' + (char)(rand%26));   
  45. }   
  46. else  
  47. {   
  48. code = (char)('0' + (char)(rand%10));   
  49. }   
  50. randomcode += code.ToString();   
  51. }   
  52. return  randomcode;   
  53. }   
  54. ///  <summary>   
  55. ///  创建随机码图片   
  56. ///  </summary>   
  57. ///  <param  name="randomcode">随机码</param>   
  58. private  void  CreateImage(string randomcode)   
  59. {   
  60. int randAngle = 45; //随机转动角度   
  61. int mapwidth = (int)(randomcode.Length * 23);   
  62. Bitmap map = new Bitmap(mapwidth,28);//创建图片背景   
  63. Graphics graph = Graphics.FromImage(map);   
  64. graph.Clear(Color.AliceBlue);//清除画面,填充背景   
  65. graph.DrawRectangle(new Pen(Color.Black,0),0,0,map.Width-1,map.Height-1);//画一个边框   
  66. //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式   
  67. Random rand = new Random();   
  68. //背景噪点生成   
  69. Pen blackPen = new Pen(Color.LightGray,0);   
  70. for (int i=0;i<50;i++)   
  71. {   
  72. int x = rand.Next(0,map.Width);   
  73. int y = rand.Next(0,map.Height);   
  74. graph.DrawRectangle(blackPen,x,y,1,1);   
  75. }   
  76. //验证码旋转,防止机器识别   
  77. char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组   
  78. //文字距中   
  79. StringFormat format = new StringFormat(StringFormatFlags.NoClip);   
  80. format.Alignment = StringAlignment.Center;   
  81. format.LineAlignment = StringAlignment.Center;   
  82. //定义颜色   
  83. Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };   
  84. //定义字体   
  85. string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };   
  86. for(int i=0;i<chars.Length;i++)   
  87. {   
  88. int cindex = rand.Next(7);   
  89. int findex = rand.Next(5);   
  90. Font f = new System.Drawing.Font(font[findex],13,System.Drawing.FontStyle.Bold);//字体样式(参数2为字体大小)   
  91. Brush b = new System.Drawing.SolidBrush(c[cindex]);   
  92. Point dot = new Point(16,16);   
  93. //graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//测试X坐标显示间距的   
  94. float angle = rand.Next(-randAngle,randAngle);//转动的度数   
  95. graph.TranslateTransform(dot.X,dot.Y);//移动光标到指定位置   
  96. graph.RotateTransform(angle);   
  97. graph.DrawString(chars[i].ToString(),f,b,1,1,format);   
  98. //graph.DrawString(chars[i].ToString(),fontstyle,new SolidBrush(Color.Blue),1,1,format);   
  99. graph.RotateTransform(-angle);//转回去   
  100. graph.TranslateTransform(2,-dot.Y);//移动光标到指定位置   
  101. }   
  102. //graph.DrawString(randomcode,fontstyle,new SolidBrush(Color.Blue),2,2); //标准随机码   
  103. //生成图片   
  104. System.IO.MemoryStream ms = new System.IO.MemoryStream();   
  105. map.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);   
  106. Response.ClearContent();   
  107. Response.ContentType = "image/gif";   
  108. Response.BinaryWrite(ms.ToArray());   
  109. graph.Dispose();   
  110. map.Dispose();   
  111. }  
  112. #region Web 窗体设计器生成的代码   
  113. override protected void OnInit(EventArgs e)   
  114. {   
  115. //   
  116. // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。   
  117. //   
  118. InitializeComponent();   
  119. base.OnInit(e);   
  120. }   
  121. /// <summary>   
  122. /// 设计器支持所需的方法 - 不要使用代码编辑器修改   
  123. /// 此方法的内容。   
  124. /// </summary>   
  125. private void InitializeComponent()   
  126. {   
  127. this.Load += new System.EventHandler(this.Page_Load);   
  128. }  
  129. #endregion   
  130. }   
  131. }   

 

posted @ 2014-02-27 17:56  zzg168  阅读(255)  评论(0编辑  收藏  举报