当前位置:首页 > 编程学习 > [转].NET实现中英文验证码

[转].NET实现中英文验证码

编程学习2010-02-2147470

最终效果如图:

[转].NET实现中英文验证码  编程 网页制作 .NET 第1张

  CheckCode.aspx.cs代码如下

protected void Page_Load(object sender, EventArgs e)
{
    //获取GB2312编码页(表)
    /**//**
     * 生成中文验证验码所要使用的方法
     * 注,生成中文验证码时要改变一下生成验证码图片的宽度
     * var imageCode = new  System.Drawing.Bitmap((int)Math.Ceiling((code.Length * 22.5)), 23);  //定义图片的宽度和高度
     **/
                 
    //var gb = Encoding.GetEncoding("gb2312");
                 
    /**/////调用函数产生4个随机中文汉字编码
    //object[] bytes = CreateRegionCode(4);
                 
    /**/////根据汉字编码的字节数组解码出中文汉字
    //var sbCode = new  StringBuilder().Append(gb.GetString((byte[])Convert.ChangeType(bytes[0],  typeof(byte[]))))
    //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[1],  typeof(byte[]))))
    //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[2],  typeof(byte[]))))
    //    .Append(gb.GetString((byte[])Convert.ChangeType(bytes[3],  typeof(byte[]))));
    //CreateCheckCodeImage(sbCode.ToString());
                 
    CreateCheckCodeImage(GenerateCheckCode());       //生成数字英文所要使用的方法
}


生成汉字验证码#region 生成汉字验证码

/**//// <summary>
///  此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将四个字节数组存储在object数组中。
/// </summary>
/// <param name="strLength">代表需要产生的汉字个数</param>
/// <returns></returns>
static object[] CreateRegionCode(int strLength)
{
    var rBase = new[]
        {
             "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"
        };
           
    var random = new Random();
    var bytes = new object[strLength];
           
    /**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
     每个汉字有四个区位码组成
     区位码第1位和区位码第2位作为字节数组第一个元素
     区位码第3位和区位码第4位作为字节数组第二个元素
    */
           
    for (int i = 0; i < strLength; i++)
    {
        //区位码第1位
        var r1 = random.Next(11, 14);
        var str_r1 = rBase[r1].Trim();
           
        random = new Random(r1 * unchecked((int)DateTime.Now.Ticks) +  i);   //更换随机数发生器的种子避免产生重复值
           
           
        var r2 = 0;
        if (r1 == 13)
            r2 = random.Next(0, 7);
        else
            r2 = random.Next(0, 16);
           
        var str_r2 = rBase[r2].Trim();
           
        //区位码第3位
        random = new Random(r2 * unchecked((int)DateTime.Now.Ticks) +  i);
        var r3 = random.Next(10, 16);
        var str_r3 = rBase[r3].Trim();
           
        //区位码第4位
        random = new Random(r3 * unchecked((int)DateTime.Now.Ticks) +  i);
        var r4 = 0;
        if (r3 == 10)
            r4 = random.Next(1, 16);
        else if (r3 == 15)
            r4 = random.Next(0, 15);
        else
            r4 = random.Next(0, 16);
           
        var str_r4 = rBase[r4].Trim();
           
        var byte1 = Convert.ToByte(str_r1 + str_r2, 16);
        var byte2 = Convert.ToByte(str_r3 + str_r4, 16);
        //将两个字节变量存储在字节数组中
        var str_r = new[] { byte1, byte2 };
           
        //将产生的一个汉字的字节数组放入object数组中
        bytes.SetValue(str_r, i);
    }
    return bytes;
}
#endregion

生成图片#region 生成图片

void CreateCheckCodeImage(string code)
{
    var imageCode = new  System.Drawing.Bitmap((int)Math.Ceiling((code.Length * 12.5)), 23);  //定义图片的宽度和高度
    var g = Graphics.FromImage(imageCode);  //加载图片到画布上
         
    try
    {
        var random = new Random();
        g.Clear(Color.White); //清空图片背景色
         
        //画图片的背景噪音线
        for (int i = 0; i < 25; i++)
        {
            var x1 = random.Next(imageCode.Width);
            var x2 = random.Next(imageCode.Width);
            var y1 = random.Next(imageCode.Height);
            var y2 = random.Next(imageCode.Height);
         
            g.DrawLine(new Pen(Color.Silver), new Point(x1, y1), new  Point(x2, y2));
        }
         
        var font = new System.Drawing.Font("Arial", 12F,  System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic);
        var brush = new  System.Drawing.Drawing2D.LinearGradientBrush(
            new Rectangle(0, 0, imageCode.Width,  imageCode.Height),
            Color.Blue, Color.DarkRed, 1.2F, true);
        g.DrawString(code, font, brush, 2, 2);
         
        //画图片的前景噪音点
        for (int i = 0; i < 100; i++)
        {
            var x = random.Next(imageCode.Width);
            var y = random.Next(imageCode.Height);
            imageCode.SetPixel(x, y,  Color.FromArgb(random.Next()));
        }
         
        //画图片的边框线
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, imageCode.Width  - 1, imageCode.Height - 1);
        var ms = new System.IO.MemoryStream();
        imageCode.Save(ms,  System.Drawing.Imaging.ImageFormat.Jpeg);
         
        Response.ClearContent();
        Response.ContentType = "image/Jpeg";
        Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
        g.Dispose();
        imageCode.Dispose();
    }
         
}
#endregion

生成数据验证码#region 生成数据验证码

private string GenerateCheckCode()
{
    int number;
    char code;
    string checkCode = String.Empty;
       
    var 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();
    }
    return checkCode;
}
#endregion


  使用验证码页面:

<form id="formCode" runat="server">
<div>
    <img src="CheckCode.aspx" mce_src="CheckCode.aspx" alt="验证码"  />
</div>
</form>



扫描二维码推送至手机访问。

版权声明:本文由海阔天空发布,如需转载请注明出处。

本文链接:https://apull.net/html/20100221112.html

分享给朋友:

相关文章

怎样学习C语言

怎样学习C语言

怎样学习C语言很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?我是一个教师,已经开发了很多年的程序,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。经过这些年的开发,我深深的体会到C语言对于一个程序设计人员多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢?第一:C语言语法结构很简洁精妙,写出的程序也很高效,很便于描述算法,大多数的程序员愿意使用C语言去...

SHFileOperation介绍

SHFileOperation介绍

SHFileOperation函数功能描述:文件操作,与 Shell 的动作相同.函数原型:#include<shellapi.h> WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);参数:typedef struct _SHFILEOPSTRUCT { HWND hwnd; //父窗口句柄 UINT wFu...

致面向对象技术初学者的一封公开信

致面向对象技术初学者的一封公开信

 致面向对象技术初学者的一封公开信 Alistair Cockburn 著(1996 年2 月),袁峰 译介绍 首先我要解释一下为什么会写这封公开信。这似乎已经成了一种习惯,但这个步骤还是需要的。过去6 年中, 我曾经无数次地在饭店、酒吧、旅店大厅等各种地方以同一种方式度过愉快而漫长的夜晚:和同样追求真理、光明和智慧的伙伴一起探讨面向对象的真谛。现在,我已经可以回答很多当年我遇到的问题。这些同样的问题也在困扰着我的一位新同事,在一家饭店里,我花了整整一个晚上和他讨...

制作网页28个常用小代码

制作网页28个常用小代码

1、oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu=return(false)><td>no</table>  可用于Table2、<body onselectstart="return false"> 取消选取、防止复制3、onpaste="retu...