漂亮彩色验证码 以及 数学运算表达式形式的验证码

前台代码:
 
< asp:TextBox ID = " tbck "  runat = " server "  Width = " 107px "  SkinID = " worm " ></ asp:TextBox >
          
< img alt = " 看不清?点击更换 "  onclick = " this.src=this.src+'?' "  src = " VerifyCode.aspx "   />
        
< asp:Button ID = " Button1 "  runat = " server "  OnClick = " Button1_Click "  Text = " Button "   />
   
后台代码:
 
if  ( this .tbck.Text  ==  Request.Cookies[ " vCode " ].Value)
        {
            Response.Write(
" 相等 " );
        }


// VerifyCode.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;

public   partial   class  VerifyCode : System.Web.UI.Page
{
    
protected   void  Page_Load( object  sender, EventArgs e)
    {
        VerifyCode v 
=   new  VerifyCode();
        v.Length 
=   this .length;
        v.FontSize 
=   this .fontSize;
        v.Chaos 
=   this .chaos;
        v.BackgroundColor 
=   this .backgroundColor;
        v.ChaosColor 
=   this .chaosColor;
        v.CodeSerial 
=   this .codeSerial;
        v.Colors 
=   this .colors;
        v.Fonts 
=   this .fonts;
        v.Padding 
=   this .padding;
        
string  code  =  v.CreateVerifyCode();     //  取随机码
        v.CreateImageOnPage(code,  this .Context);     //  输出图片
        Response.Cookies.Add( new  HttpCookie( " vCode " , code));     //  使用Cookies取验证码的值
    }

    
// 验证码长度(默认6个验证码的长度)
     int  length  =   4 ;
    
public   int  Length
    {
        
get  {  return  length; }
        
set  { length  =  value; }
    }

    
// 验证码字体大小(为了显示扭曲效果,默认20像素,可以自行修改)
     int  fontSize  =   12 ;
    
public   int  FontSize
    {
        
get  {  return  fontSize; }
        
set  { fontSize  =  value; }
    }

    
// 边框补(默认1像素)
     int  padding  =   1 ;
    
public   int  Padding
    {
        
get  {  return  padding; }
        
set  { padding  =  value; }
    }

    
// 是否输出燥点(默认为输出)
     bool  chaos  =   true ;
    
public   bool  Chaos
    {
        
get  {  return  chaos; }
        
set  { chaos  =  value; }
    }

    
// 输出燥点的颜色(默认灰色)
    Color chaosColor  =  Color.LightGray;
    
public  Color ChaosColor
    {
        
get  {  return  chaosColor; }
        
set  { chaosColor  =  value; }
    }

    
// 自定义背景色(默认白色)
    Color backgroundColor  =  Color.White;
    
public  Color BackgroundColor
    {
        
get  {  return  backgroundColor; }
        
set  { backgroundColor  =  value; }
    }

    
// 自定义随机颜色数组
    Color[] colors  =  { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
    
public  Color[] Colors
    {
        
get  {  return  colors; }
        
set  { colors  =  value; }
    }

    
// 自定义字体数组
     string [] fonts  =  {  " Arial " " Georgia "  };
    
public   string [] Fonts
    {
        
get  {  return  fonts; }
        
set  { fonts  =  value; }
    }

    
// 自定义随机码字符串序列(使用逗号分隔)
   
//  string codeSerial = "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  codeSerial  =   " 0,1,2,3,4,5,6,7,8,9 " ;

    
public   string  CodeSerial
    {
        
get  {  return  codeSerial; }
        
set  { codeSerial  =  value; }
    }

    
// 生成校验码图片
     public  Bitmap CreateImageCode( string  code)
    {
        
int  fSize  =  FontSize;
        
int  fWidth  =  fSize  +  Padding;

        
int  imageWidth  =  ( int )(code.Length  *  fWidth)  +   4   +  Padding  *   2 ;
        
int  imageHeight  =  fSize  *   2   +  Padding;

        System.Drawing.Bitmap image 
=   new  System.Drawing.Bitmap(imageWidth, imageHeight);

        Graphics g 
=  Graphics.FromImage(image);

        g.Clear(BackgroundColor);

        Random rand 
=   new  Random();

        
// 给背景添加随机生成的燥点
         if  ( this .Chaos)
        {
            Pen pen 
=   new  Pen(ChaosColor,  0 );
            
int  c  =  Length  *   15 ;

            
for  ( int  i  =   0 ; i  <  c; i ++ )
            {
                
int  x  =  rand.Next(image.Width);
                
int  y  =  rand.Next(image.Height);

                g.DrawRectangle(pen, x, y, 
1 1 );
            }
        }

        
int  left  =   0 , top  =   0 , top1  =   1 , top2  =   1 ;

        
int  n1  =  (imageHeight  -  FontSize  -  Padding  *   2 );
        
int  n2  =  n1  /   4 ;
        top1 
=  n2;
        top2 
=  n2  *   2 ;

        Font f;
        Brush b;

        
int  cindex, findex;

        
// 随机字体和颜色的验证码字符
         for  ( int  i  =   0 ; i  <  code.Length; i ++ )
        {
            cindex 
=  rand.Next(Colors.Length  -   1 );
            findex 
=  rand.Next(Fonts.Length  -   1 );

            f 
=   new  System.Drawing.Font(Fonts[findex], fSize, System.Drawing.FontStyle.Bold);
            b 
=   new  System.Drawing.SolidBrush(Colors[cindex]);

            
if  (i  %   2   ==   1 )
            {
                top 
=  top2;
            }
            
else
            {
                top 
=  top1;
            }

            left 
=  i  *  fWidth;

            g.DrawString(code.Substring(i, 
1 ), f, b, left, top);
        }

        
// 画一个边框 边框颜色为Color.White
        g.DrawRectangle( new  Pen(Color.White,  0 ),  0 0 , image.Width  -   1 , image.Height  -   1 );
        g.Dispose();

        
return  image;
    }

    
// 将创建好的图片输出到页面
     public   void  CreateImageOnPage( string  code, HttpContext context)
    {
        System.IO.MemoryStream ms 
=   new  System.IO.MemoryStream();
        Bitmap image 
=   this .CreateImageCode(code);

        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

        context.Response.ClearContent();
        context.Response.ContentType 
=   " image/jpeg " ;
        context.Response.BinaryWrite(ms.GetBuffer());

        ms.Close();
        ms 
=   null ;
        image.Dispose();
        image 
=   null ;
    }

    
// 生成随机字符码
     public   string  CreateVerifyCode( int  codeLen)
    {
        
if  (codeLen  ==   0 )
        {
            codeLen 
=  Length;
        }

        
string [] arr  =  CodeSerial.Split( ' , ' );

        
string  code  =   "" ;

        
int  randValue  =   - 1 ;

        Random rand 
=   new  Random( unchecked (( int )DateTime.Now.Ticks));

        
for  ( int  i  =   0 ; i  <  codeLen; i ++ )
        {
            randValue 
=  rand.Next( 0 , arr.Length  -   1 );

            code 
+=  arr[randValue];
        }

        
return  code;
    }

    
public   string  CreateVerifyCode()
    {
        
return  CreateVerifyCode( 0 );
    }
}

 

 

 

 

 

 

 

 

 

 
///   <summary>
///  数学算式的验证码  
///  http://www.zu14.cn/2008/11/22/net_math_vc/
///  Author: DeltaCat (三角猫)
///   </summary>


public   sealed   class  MathVerifyCode
{
    
#region  生成图片

    
///   <summary>
    
///  输出验证码表达式到浏览器
    
///   </summary>
    
///   <param name="context"> httpcontext </param>
    
///   <param name="sessionKey"> 保存运算值的SESSION的KEY </param>
     public   void  OutputImage(System.Web.HttpContext context,  string  sessionKey)
    {
        
int  mathResult  =   0 ;
        
string  expression  =   null ;

        Random rnd 
=   new  Random();

        
/// /生成3个10以内的整数,用来运算
         int  operator1  =  rnd.Next( 0 10 );
        
int  operator2  =  rnd.Next( 0 10 );
        
int  operator3  =  rnd.Next( 0 10 );

        
/// /随机组合运算顺序,只做 + 和 * 运算
         switch  (rnd.Next( 0 3 ))
        {
            
case   0 :
                mathResult 
=  operator1  +  operator2  *  operator3;
                expression 
=   string .Format( " {0} + {1} * {2} = ? " , operator1, operator2, operator3);
                
break ;
            
case   1 :
                mathResult 
=  operator1  *  operator2  +  operator3;
                expression 
=   string .Format( " {0} * {1} + {2} = ? " , operator1, operator2, operator3);
                
break ;
            
default :
                mathResult 
=  operator2  +  operator1  *  operator3;
                expression 
=   string .Format( " {0} + {1} * {2} = ? " , operator2, operator1, operator3);
                
break ;
        }

        
using  (Bitmap bmp  =   new  Bitmap( 150 25 ))
        {
            
using  (Graphics graph  =  Graphics.FromImage(bmp))
            {
                graph.Clear(Color.FromA#e8eef7); 
/// /背景色,可自行设置

                
/// /画噪点
                 for  ( int  i  =   0 ; i  <=   128 ; i ++ )
                {
                    graph.DrawRectangle(
                        
new  Pen(Color.FromArgb(rnd.Next( 0 255 ), rnd.Next( 0 255 ), rnd.Next( 0 255 ))),
                        rnd.Next(
2 128 ),
                        rnd.Next(
2 38 ),
                        
1 ,
                        
1 );
                }

                
/// /输出表达式
                 for  ( int  i  =   0 ; i  <  expression.Length; i ++ )
                {
                    graph.DrawString(expression.Substring(i, 
1 ),
                        
new  Font(FontFamily.GenericSansSerif,  12 , FontStyle.Bold),
                        
new  SolidBrush(Color.FromArgb(rnd.Next( 255 ), rnd.Next( 128 ), rnd.Next( 255 ))),
                        
5   +  i  *   10 ,
                        rnd.Next(
1 5 ));
                }

                
/// /画边框,不需要可以注释掉
                graph.DrawRectangle( new  Pen(Color.Firebrick),  0 0 150   -   1 25   -   1 );
            }

            context.Session[sessionKey] 
=  mathResult;  /// /将运算结果存入session

            
/// /禁用缓存
            DisableHttpCache(context);

            
/// /输出图片到浏览器,我采用的是 gif 格式,可自行设置其他格式
            context.Response.ContentType  =   " image/gif " ;
            bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
            context.Response.End();
        }
    }

    
#endregion

    
///   <summary>
    
///  禁用缓存
    
///   </summary>
    
///   <param name="context"> httpcontext </param>
     private   static   void  DisableHttpCache(System.Web.HttpContext context)
    {
        
/// /清除http缓存
        context.Response.ClearHeaders();
        context.Response.ClearContent();
        
/// /禁用http缓存
        
/// / http 1.1
        context.Response.AddHeader( " Expires " " Mon, 26 Jul 1997 05:00:00 GMT " );
        context.Response.AddHeader(
" Cache-Control " " no-store, no-cache, max-age=0, must-revalidate " );
        
/// / http 1.0
        context.Response.AddHeader( " Pragma " " no-cache " );
    }
}


注: 如果觉得验证码太模糊,可以将画噪点的地方调整为下面的:

                
for  ( int  i  =   0 ; i  <=   128 ; i ++ )
                {
                    graph.DrawRectangle(
                        
new  Pen(Color.FromArgb(rnd.Next( 0 255 ), rnd.Next( 0 255 ), rnd.Next( 0 255 ))),
                        (
float )rnd.Next( 2 128 ),
                        (
float )rnd.Next( 2 38 ),
                        
0.5F // 噪点的粒度
                         0.5F ); // 噪点的粒度,可以调节这两个值,到认为自己满意
                }



// 新建一个 ashx 页面,例如: Mvc.ashx
// 记得此ashx文件的类,一定要继承 System.Web.SessionState.IRequiresSessionState 才可以使用session

public   class  Mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
    
public   void  ProcessRequest (HttpContext context) {
        MathVerifyCode mvc 
=   new  MathVerifyCode();
        mvc.OutputImage(context, 
" mvc " );
    }

    
public   bool  IsReusable {
        
get  {
            
return   true ;
        }
    }
}


在需要显示验证码的地方,加入:

< img src = " mvc.aspx "  alt = "" /> 或者 < img src = " mvc.ashx "  alt = "" />

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值