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

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

编程学习2010-02-2145140

最终效果如图:

[转].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

分享给朋友:

相关文章

SHFileOperation介绍

SHFileOperation介绍

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

关于学习编程和C语言

关于学习编程和C语言

关于学习编程和C语言  转自 开复网 Q:该怎么学习编程?  A:首先问你一个问题:你们在学校都学些什么课程? 问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比如,尽管你将来不会去涉及电脑的...

 C++中指针的使用艺术

C++中指针的使用艺术

C++中指针的使用艺术 在C++编程中使用指针能有速度快,节约内存等优点,是很多C++程序员的最爱。但指针是一把双刃剑,用好了它,你就会发现指针有多么的方便,反之,你可能就头疼了,往往会出现意想不到的问题。   一.什么是指针:   其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针只是一个指示器,它告诉程序在内存的哪块区域可以找到数据。   这是一个非常重要的概念,有很多程序和算法都是围绕指针设计的,如链...

为什么每个程序员都应该学习C语言

为什么每个程序员都应该学习C语言

为什么每个程序员都应该学习C语言 每个程序员在他们的编程生涯中都应该学习C语言,因为它有太多难以忽视的好处了。除了它会给你提供更多的工作机会之外,C语言还会教给你更多的关于计算机的知识。它能给我们提供的裨益,简单列举如下:   1)相比较其他的编程语言(像C++,JAVA),C语言是个低级语言。从总体上来说,低级的编程语言可以让你更好的了解计算机。   2)设备驱动程序和操作系统只能用C语言来编写。现在,你...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。