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

前台代码:
 
<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, 
11);
            }
        }

        
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), 00, 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(010);
        
int operator2 = rnd.Next(010);
        
int operator3 = rnd.Next(010);

        
////随机组合运算顺序,只做 + 和 * 运算
        switch (rnd.Next(03))
        {
            
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(15025))
        {
            
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(0255), rnd.Next(0255), rnd.Next(0255))),
                        rnd.Next(
2128),
                        rnd.Next(
238),
                        
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(
15));
                }

                
////画边框,不需要可以注释掉
                graph.DrawRectangle(new Pen(Color.Firebrick), 00150 - 125 - 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(0255), rnd.Next(0255), rnd.Next(0255))),
                        (
float)rnd.Next(2128),
                        (
float)rnd.Next(238),
                        
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=""/>

 

 


原文地址:https://www.cnblogs.com/zengxiangzhan/p/1572560.html