自动生成验证码图像的方法

来源:互联网 发布:买域名哪里好 编辑:程序博客网 时间:2024/05/01 00:26

很多论坛或BLOG中都有验证码,其实现方法无外乎生成一个随机的编码,然后把它画成一个图像,同时在图像中生成一些迷惑点。以下是实现方式:
 
//生成随机数
public string CreateRandomCode(int codeCount)  {
   string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,
                    K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
   string[] allCharArray = allChar.Split(',');
   string randomCode = "";
   int temp = -1;
   Random rand = new Random();
   for (int i = 0; i < codeCount; i++)
   {
      if (temp != -1)
      {
         rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
      }
      int t = rand.Next(36);
      if (temp != -1 && temp == t)
      {
          return CreateRandomCode(codeCount);
      }
      temp = t;
      randomCode += allCharArray[t];
   }
   return randomCode;
}

//生成随机数图片数据
public void CreateImage(string checkCode)
{
   int iwidth = (int)(checkCode.Length * 15);
   System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 25);
   Graphics g = Graphics.FromImage(image);
   g.Clear(Color.White);
   //定义颜色
   Color[] c = { Color.Black,
                 Color.Red,
                 Color.DarkBlue,
                 Color.Green,
                 Color.Orange,
                 Color.Brown,
                 Color.DarkCyan,
                 Color.Purple
                };
    //定义字体
    string[] font = { "Verdana",
                      "Microsoft Sans Serif",
                      "Comic Sans MS",
                      "Arial",
                      "宋体"
                     };
    Random rand = new Random();
    //随机输出噪点
    for (int i = 0; i < 50; i++)
    {
        int x = rand.Next(image.Width);
        int y = rand.Next(image.Height);
        g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
    }
    //输出不同字体和颜色的验证码字符
    for (int i = 0; i < checkCode.Length; i++)
    {
       int cindex = rand.Next(7);
       int findex = rand.Next(5);
       Font f = new System.Drawing.Font(font[findex], 12,
                           System.Drawing.FontStyle.Bold);
       Brush b = new System.Drawing.SolidBrush(c[cindex]);
       int ii = 4;
       if ((i + 1) % 2 == 0)
       {
          ii = 2;
       }
       g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);
    }
    //画一个边框
    g.DrawRectangle(new Pen(Color.Black, 0), 0, 0,
                  image.Width - 1, image.Height - 1);
    //输出到浏览器
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    Response.ClearContent();
    Response.ContentType = "image/Gif";
    Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();
 }

 
有了以上两个方法,具体使用可以参照如下:
string Code = this.CreateRandomCode(4);//先产生数字串 
CreateImage(Code);//作图

0 0