请问网站登陆中的那个随机生成的图片验证码是怎么实现的呢???

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3188/3188775.xml?temp=3.181094E-02
      

  2.   

    /* Copyright all(c) 2005 ZhongFeng, http://blog.csdn.net/SW515 */
     public class ValidateCode : System.Web.UI.Page
     {
      private void Page_Load(object sender, System.EventArgs e)
      {
       this.CreateCheckCodeImage(GenerateCheckCode());
      }  #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {    
       this.Load += new System.EventHandler(this.Page_Load);
      }
      #endregion  private string GenerateCheckCode()
      {
       int number;
       char code;
       string checkCode = String.Empty;   System.Random random = new Random();   for(int i=0; i<5; i++)
       {
        number = random.Next();    if(number % 2 == 0)
         code = (char)('0' + (char)(number % 10));
        else
         code = (char)('A' + (char)(number % 26));    checkCode += code.ToString();
       }   Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));   return checkCode;
      }  private void CreateCheckCodeImage(string checkCode)
      {
       if(checkCode == null || checkCode.Trim() == String.Empty)
        return;   System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
       Graphics g = Graphics.FromImage(image);   try
       {
        //生成随机生成器
        Random random = new Random();    //清空图片背景色
        g.Clear(Color.White);    //画图片的背景噪音线
        for(int i=0; i<25; 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.Silver), x1, y1, x2, y2);
        }    Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
        g.DrawString(checkCode, font, brush, 2, 2);    //画图片的前景噪音点
        for(int i=0; i<100; 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();
       }
      }
     }
        假如以上验证码生成器页面名为:CheckCode.aspx,那么在登录页面中使用“<IMG>” 这个 HTML 元素来显示生成的验证码图片:<IMG src="CheckCode.aspx">
      在登录页面的登录按钮的处理事件中使用以下代码判断验证码:
      private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
      {
       if(Request.Cookies["CheckCode"] == null)
       {
        lblMessage.Text = "您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统。";
        lblMessage.Visible = true;
        return;
       }    if(String.Compare(Request.Cookies["CheckCode"].Value, txtCheckCode.Text, true) != 0)
       {
        lblMessage.Text = "验证码错误,请输入正确的验证码。";
        lblMessage.Visible = true;
        return;
       }
      

  3.   

    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.IO;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;namespace WebApplication2
    {
    /// <summary>
    /// VerifyCode 的摘要说明。
    /// </summary>
    public class VerifyCode : System.Web.UI.Page
    {
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面 if (!IsPostBack)
    {
    Random seedRnd = new Random();
    double verifyCode= seedRnd.Next(10000, 99999); Session["regpass"]=verifyCode.ToString(); Bitmap image = new Bitmap ( 60 , 20 ); Graphics g = Graphics.FromImage(image) ; g.FillRectangle (new SolidBrush(Color.FromArgb(200,200,200)),0 ,0 ,60,20) ;
    Font axesFont = new Font ( "Arial Black" , 12 ) ; Brush blackBrush = new SolidBrush ( Color . Black ) ; g.DrawString(verifyCode.ToString(),axesFont,blackBrush,-1,-1 ) ;
    //Font axesFont = new Font ( "Arial Black" , 6 ) ;
    //Brush blackBrush = new SolidBrush ( Color.FromArgb(220,220,220)) ;
    //循环写入乱七八糟文字。
    /*
    int x1;
    int x2;
    int y1;
    int y2;
    int h=1;
    Pen rndPen = new Pen ( Color.White , 1 ) ;
    while (h<100)
    {
    x1=Rnd1.Next(0,60);
    x2=Rnd1.Next(0,60);
    y1=Rnd1.Next(0,30);
    y2=Rnd1.Next(0,30);
    g . DrawLine ( rndPen , x1 , y1 , x1+2 , y1+2 ) ;
    h++;
    }
    */
    Pen grayPen = new Pen ( Color.DarkGray , 2 ) ;
    g.DrawLine ( grayPen , 0 , 0 , 0 , 20 ) ;
    g.DrawLine ( grayPen , 60 , 0 , 60 , 20) ;
    g.DrawLine ( grayPen , 0 , 0 , 60 , 0 ) ;
    g.DrawLine ( grayPen , 0 , 20 , 60 , 20 ) ;
    image.Save( Response.OutputStream,ImageFormat.Jpeg); 
    }//if }// Page_Load #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load);
    }
    #endregion
    }
    }
    这个是用随生成的汉字,比数字的更好!
      

  4.   

    http://blog.csdn.net/codeangel/archive/2005/06/20/398860.aspx
    经典
      

  5.   

    下面是网站上的验证码自动生成随机数
    public string CutStr(string str,int n)//可能是让返回的字符串占N个字节
    {
    string ss="";//返回值
    if (str.Length<=n/2)
    {
    ss=str;
    }
    else
    {
    int t=0;
    char[] tmp=str.ToCharArray();
    for (int i=0;i<str.Length;i++)
    {
    int c;
    //c=Convert.ToInt32(str.Substring(i,1));
    c=(int)tmp[i];
    if (c<0)
    c=c+65536;
    if (c>255)
    t=t+2;
    else
    t=t+1;
    if (t>n)
    break;
    ss=ss+str.Substring(i,1);
    }
    }
    return ss;}public string CutStrWithD(string str,int n)
    {
    string ss="";//返回值
    if (str.Length<=n/2)
    {
    ss=str;
    }
    else
    {
    int t=0;
    char[] tmp=str.ToCharArray();
    for (int i=0;i<str.Length;i++)
    {
    int c;
    //c=Convert.ToInt32(str.Substring(i,1));
    c=(int)tmp[i];
    if (c<0)
    c=c+65536;
    if (c>255)
    t=t+2;
    else
    t=t+1;
    if (t>n)
    break;
    ss=ss+str.Substring(i,1);
    }
    ss=ss+"...";
    }
    return ss;
    }
      

  6.   

    //生成随机数函数中从Vchar数组中随机抽取
    //字母区分大小写
    //参数为生成随机数的位数
    public string RndNum(int VcodeNum) //
    {
    string Vchar = "0,1,2,3,4,5,6,7,8,9" ;
    string[] VcArray = Vchar.Split(',') ;
    string  VNum = "" ;//由于字符串很短,就不用StringBuilder了
    int temp = -1 ;//记录上次随机数值,尽量避免生产几个一样的随机数
    //采用一个简单的算法以保证生成随机数的不同
    Random rand =new Random();
    for ( int i = 1 ; i < VcodeNum+1 ; i++ ) 
    {    
    if ( temp != -1) 
    {
    rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));
    }    
    //int t =  rand.Next(35) ;
    int t=rand.Next(10);
    if (temp != -1 && temp == t) 
    {
    return RndNum( VcodeNum );
    }
    temp = t  ;
    VNum += VcArray[t];
    }
    return VNum ;//它肯定不是四位?
    }
      

  7.   

    有问题 RndNum(16) >16 和多次调用 IIS池挂掉
      

  8.   

    http://blog.csdn.net/guanzhongs/archive/2005/12/29/564796.aspx
      

  9.   

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Drawing;
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            CreateImage cc = new CreateImage();
            cc.DrawImage();
        }        /// <summary>
    /// 验证码模块
    /// </summary>
    public class CreateImage
    {
    public void DrawImage()
    {
    CreateImage img=new CreateImage();
    HttpContext.Current.Session["CheckCode"]=img.RndNum(4);
    img.CreateImages(HttpContext.Current.Session["CheckCode"].ToString());
    }/// <summary>
    /// 生成验证图片
    /// </summary>
    /// <param name="checkCode">验证字符</param>
    private void CreateImages(string checkCode)
    {
    int iwidth = (int)(checkCode.Length * 13);
    System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
    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, 1), 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], 10, System.Drawing.FontStyle.Bold);
    Brush b = new System.Drawing.SolidBrush(c[cindex]);
    int ii=5;
    if((i+1)%2==0)
    {
    ii=1;
    }
    g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);//
    }
    //画一个边框
    g.DrawRectangle(new Pen(Color.Black,1),0,0,image.Width-1,image.Height-1);//输出到浏览器
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
    HttpContext.Current.Response.ClearContent();
    //Response.ClearContent();
    HttpContext.Current.Response.ContentType = "image/Jpeg";
    HttpContext.Current.Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();
    }/// <summary>
    /// 生成随机的字母
    /// </summary>
    /// <param name="VcodeNum">生成字母的个数</param>
    /// <returns>string</returns>
    private string RndNum(int VcodeNum) 
    {
    string Vchar = "0,1,2,3,4,5,6,7,8,9" ;
    string[] VcArray = Vchar.Split(',') ;
    string VNum = "" ; //由于字符串很短,就不用StringBuilder了
    int temp = -1 ; //记录上次随机数值,尽量避免生产几个一样的随机数//采用一个简单的算法以保证生成随机数的不同
    Random rand =new Random();
    for ( int i = 1 ; i < VcodeNum+1 ; i++ ) 

    if ( temp != -1) 
    {
    rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));

    int t = rand.Next(VcArray.Length ) ;
    if (temp != -1 && temp == t) 
    {
    return RndNum( VcodeNum );
    }
    temp = t ;
    VNum += VcArray[t];
    }
    return VNum ;
    }
    }
    }
      

  10.   

    http://www.cinenn.com/blog/CommentView,guid,004bff1f-2c76-4e49-8fe6-4fa96799571a.aspx
    Asp.Net 动态生成验证码