checkCode.cs
上传用户:shjujing
上传日期:2022-07-28
资源大小:11244k
文件大小:4k
源码类别:

Email客户端

开发平台:

Visual C++

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.Drawing;
  11. /// <summary>
  12. /// checkCode 的摘要说明
  13. /// </summary>
  14. public class checkCode
  15. {
  16. public checkCode()
  17. {
  18. //
  19. // TODO: 在此处添加构造函数逻辑
  20. //
  21. }
  22.     public static void DrawImage()
  23.     {
  24.         checkCode img = new checkCode();
  25.         HttpContext.Current.Session["CheckCode"] = img.RndNum(4);
  26.         img.checkCodes(HttpContext.Current.Session["CheckCode"].ToString());
  27.     }
  28.     /// <summary>
  29.     /// 生成验证图片
  30.     /// </summary>
  31.     /// <param name="checkCode">验证字符</param>
  32.     private void checkCodes(string checkCode)
  33.     {
  34.         int iwidth = (int)(checkCode.Length * 13);
  35.         System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
  36.         Graphics g = Graphics.FromImage(image);
  37.         g.Clear(Color.White);
  38.         //定义颜色
  39.         Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
  40.         //定义字体 
  41.         string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
  42.         Random rand = new Random();
  43.         //随机输出噪点
  44.         for (int i = 0; i < 50; i++)
  45.         {
  46.             int x = rand.Next(image.Width);
  47.             int y = rand.Next(image.Height);
  48.             g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
  49.         }
  50.         //输出不同字体和颜色的验证码字符
  51.         for (int i = 0; i < checkCode.Length; i++)
  52.         {
  53.             int cindex = rand.Next(7);
  54.             int findex = rand.Next(5);
  55.             Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
  56.             Brush b = new System.Drawing.SolidBrush(c[cindex]);
  57.             int ii = 4;
  58.             if ((i + 1) % 2 == 0)
  59.             {
  60.                 ii = 2;
  61.             }
  62.             g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
  63.         }
  64.         //画一个边框
  65.         g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
  66.         //输出到浏览器
  67.         System.IO.MemoryStream ms = new System.IO.MemoryStream();
  68.         image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
  69.         HttpContext.Current.Response.ClearContent();
  70.         //Response.ClearContent();
  71.         HttpContext.Current.Response.ContentType = "image/Jpeg";
  72.         HttpContext.Current.Response.BinaryWrite(ms.ToArray());
  73.         g.Dispose();
  74.         image.Dispose();
  75.     }
  76.     /// <summary>
  77.     /// 生成随机的字母
  78.     /// </summary>
  79.     /// <param name="VcodeNum">生成字母的个数</param>
  80.     /// <returns>string</returns>
  81.     private string RndNum(int VcodeNum)
  82.     {
  83.         string Vchar = "0,1,2,3,4,5,6,7,8,9";
  84.         string[] VcArray = Vchar.Split(',');
  85.         string VNum = ""; //由于字符串很短,就不用StringBuilder了
  86.         int temp = -1; //记录上次随机数值,尽量避免生产几个一样的随机数
  87.         //采用一个简单的算法以保证生成随机数的不同
  88.         Random rand = new Random();
  89.         for (int i = 1; i < VcodeNum + 1; i++)
  90.         {
  91.             if (temp != -1)
  92.             {
  93.                 rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
  94.             }
  95.             int t = rand.Next(VcArray.Length);
  96.             if (temp != -1 && temp == t)
  97.             {
  98.                 return RndNum(VcodeNum);
  99.             }
  100.             temp = t;
  101.             VNum += VcArray[t];
  102.         }
  103.         return VNum;
  104.     }
  105. }