随笔-75  评论-74  文章-35  trackbacks-1

静幽谷原创    作者:李武剑      如转载请注明来处,谢谢。

首先在网上找了很多资料,但是发现很多根本不能用,各种各样的错误出现了
好多是引用不全,还有版本不同,所以决定自己改一个试一下,效果还过得去,呵呵实用就好。
不多说了介绍程序:
下面是生成图片页面的代码,新建一个文件,比如:ValidataImage.aspx 拷入下面代码即可。

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
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;
using  System.Drawing.Imaging;
using  System.Text;
using  System.IO;

public  partial  class  ValidateImage : System.Web.UI.Page
{
       
protected   void  Page_Load( object  sender, EventArgs e)
    
{
        
if  (Session[ " checkValidate " !=   null //这里要判断session的值是不是为空,如果直接用session["checkValidate"].ToString 的话就会出错。
        
{
            
this .ValidateCode(Session[ " checkValidate " ].ToString());
        }

        
else
        
{
            Response.Write(
" 未收到参数! " );
        }

          
    }


    
private   void  ValidateCode( string  VNum)
    
{
        Bitmap Img 
=   null ;
        Graphics g 
=   null ;
        MemoryStream ms 
=   null ;

        
int  gheight  =  VNum.Length  *   16 ;
        Img 
=   new  Bitmap(gheight,  22 );
        g 
=  Graphics.FromImage(Img);
        
// 背景颜色
        g.Clear(Color.White);
        
// 文字字体
        Font f  =   new  Font( " Arial Black " 13 , System.Drawing.FontStyle.Italic);
        
// 文字颜色
        SolidBrush s  =   new  SolidBrush(Color.Gray);
        g.DrawString(VNum, f, s, 
1 - 1 );
        
// 画噪点,这个是偶改的,这里加一些随机的图案避免软件识别,你可以改的更好哦,for语句中的60是噪点的数量 ,拟可以随便加,而且你可以在这里画线,画园,用的是计算机型学的一些知识,我也是现学现用,后面一个注释掉的是画线的方法,呵呵。
        Pen blackPen  =   new  Pen(Color.Silver,  0 );
        Random rand 
=   new  Random();
        
for  ( int  i  =   0 ; i  <   60 ; i ++ )
        
{
            
int  x  =  rand.Next(Img.Width);
            
int  y  =  rand.Next(Img.Height);
            
// g.DrawLine(blackPen, 0, y,Img.Width, y);
            g.DrawEllipse(blackPen, x, y,  1 1 );            //g.DrawElipse() 是画圆的方法,把生成图片的高度和宽度随机出坐标画一个点。
        }


        ms 
=   new  MemoryStream();
        Img.Save(ms, ImageFormat.Jpeg);
        Response.ClearContent();
        Response.ContentType 
=   " image/Jpeg " ;
        Response.BinaryWrite(ms.ToArray());
       
        g.Dispose();        //释放资源别忘了
        Img.Dispose();
        Response.End();
    }

}

然后,在登录页面中,插入如下代码:
 private string RndNum(int VcodeNum)
    
{
        
string Vchar = "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[] VcArray = Vchar.Split(new Char[] ',' });
        
string VNum = "";
        
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);
            
if (temp != -1 && temp == t)
            
{
                
return RndNum(VcodeNum);
            }

            temp 
= t;
            VNum 
+= VcArray[t];
        }

        
return VNum;
    }


    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)    //这里这个一定要加哦,不加的话,你点提交后session的值就又变了。
        
{
            
string checkValidate = RndNum(4);
            Session[
"checkValidate"= checkValidate;
        }

    }

下面代码,一个过程是用来产生随机数的,下面一个是Page_Load不用介绍了吧。

效果如下:
无标题.bmp

判断验证码就不用我来加了吧,Session["checkValidata"].ToString   跟你输入的text进行比较吧。

asp.net2.0下调试通过。
posted on 2007-01-08 15:18 影子 阅读(113) 评论(0)  编辑  收藏 所属分类: 学习笔记