asp.net 生成验证码源码

 代码如下 复制代码

<%@ WebHandler Language="C#" Class="verifyCode" %>

using System;
using System.Web;
using System.Web.SessionState;//第一步导入命名空间
using System.Drawing;

public class verifyCode : IHttpHandler, IRequiresSessionState
{//第二步实现接口 就和平常一样可以使用session

    public void ProcessRequest(HttpContext context)
    {
        string checkCode = this.CreateRandomCode(4).ToLower();
        context.Session["checkCode"] = checkCode;
        this.CreateImage(context, checkCode);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    /// <summary>
    /// 按位生成随机
    /// </summary>
    /// <param name="codeCount"></param>
    /// <returns></returns>
    private string CreateRandomCode(int codeCount)
    {
        int number;
        string checkCode = String.Empty;
        Random random = new Random();
        for (int i = 0; i < codeCount; i++)
        {
            number = random.Next(100);
            switch (number % 3)
            {
                case 0:
                    checkCode += ((char)('0' + (char)(number % 10))).ToString();
                    break;
                case 1:
                    checkCode += ((char)('a' + (char)(number % 26))).ToString();
                    break;
                case 2:
                    checkCode += ((char)('A' + (char)(number % 26))).ToString();
                    break;
                default:
                    break;
            }
        }
        return checkCode;
    }

    /// <summary>
    /// 根据字符生成图片
    /// </summary>
    /// <param name="context"></param>
    /// <param name="checkCode"></param>
    private void CreateImage(HttpContext context,string checkCode)
    {
        int randAngle = 45;//随机转动角度
        int iwidth = (int)(checkCode.Length * 23);
        //封装GDI+ 位图,此位图由图形图像及其属性的像素数据组成,指定的宽度和高度。以像素为单位
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 28);

        //封装一个 GDI+绘图图面。无法继承此类。从指定的Image创建新的 Graphics
        Graphics g = Graphics.FromImage(image);

        //清除整个绘图面并以指定背景填充
        g.Clear(Color.AliceBlue);

        //画一个边框
        g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);

        //定义绘制直线和曲线的对象。(只是Pen的颜色,指示此Pen的宽度的值)
        Pen blackPen = new Pen(Color.LightGray, 0);

        Random rand = new Random();

        //划横线的条数 可以根据自己的要求     

        for (int i = 0; i < 50; i++)
        {
            //随机高度
            //int y = rand.Next(image.Height);
            /*绘制一条连线由坐标对指定的两个点的线条
             线条颜色、宽度和样式,第一个点的x坐标和y坐标,第二个点的x坐标和y坐标*/
            //g.DrawLine(blackPen, 0, y, image.Width, y);
            int x = rand.Next(0, image.Width);
            int y = rand.Next(0, image.Height);
            //画矩形,坐标(x,y)宽高(1,1)
            g.DrawRectangle(blackPen, x, y, 1, 1);
        }

        //拆散字符串成单个字符数组
        char[] chars = checkCode.ToCharArray();

        //文字居中
        StringFormat format = new StringFormat(StringFormatFlags.NoClip);
        format.Alignment = StringAlignment.Center;
        format.LineAlignment = StringAlignment.Center;

        //定义颜色
        Color[] c = { Color.Black, Color.DarkGray, Color.DarkOrange, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
        //定义字体
        string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体", "Arial Baltic" };

        for (int i = 0; i < chars.Length; i++)
        {
            int cindex = rand.Next(c.Length);
            int findex = rand.Next(font.Length);

            //font 封装在特定设备上呈现特定字体所需的纹理和资源(字体,大小,字体样式)
            Font f = new System.Drawing.Font(font[findex], 16, System.Drawing.FontStyle.Bold);

            /*Brush定义用于填充图形图像(如矩形、椭圆、圆形、多边形和封闭路径)的内部对象
            SolidBrush(Color.White)初始化指定的颜色 指定画笔颜色为白色*/
            Brush b = new System.Drawing.SolidBrush(c[cindex]);

            Point dot = new Point(16, 16);

            //转动的度数
            float angle = rand.Next(-randAngle, randAngle);

            //移动光标到指定位置
            g.TranslateTransform(dot.X, dot.Y);
            g.RotateTransform(angle);
            /*在指定的位置并且用指定的Brush和Font对象绘制指定的文本字符串
           (指定的字符串,字符串的文本格式,绘制文本颜色和纹理,所绘制文本的左上角的x坐标,坐标)*/
            g.DrawString(chars[i].ToString(), f, b, 1, 1, format);
            //转回去
            g.RotateTransform(-angle);
            //移动光标指定位置
            g.TranslateTransform(2, -dot.Y);
        }
        //创建存储区为内存流
        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        //将此图像以指定的格式保存到指定的流中(将其保存在内存流中,图像的格式)
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

        //清除缓冲区将流中的内容输出
        context.Response.ClearContent();

        //获取输出流的类型
        context.Response.ContentType = "image/Jpeg";

        //将二进制字符串写入HTTP输出流
        context.Response.BinaryWrite(ms.ToArray());

        g.Dispose();

        image.Dispose();
    }
}

时间: 2024-07-31 11:29:45

asp.net 生成验证码源码的相关文章

asp验证码源码

asp验证码源码 调用方法,是b.htm 页面  <form name="form1">   <Input type="text" name="a"><br>   <input type="text" name="b"><br><span><img id="yzm" src="yzm.asp"

Google Protocol Buffers快速入门(带生成C#源码的方法)

Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助. Protocol Buffers入门: 1.去 http://code.google.com/p/protobuf/downloads/list 下载一个源代码包和一个已编译好的二进制包 2.找一个Proto示例代码,使用命令 protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/address

rsa-RSA密钥生成的源码(密钥长度可控)

问题描述 RSA密钥生成的源码(密钥长度可控) 哪位大神可以提供RSA密钥生成的源码(密钥长度可控)C或者C++ 解决方案 这深了, 我也不会, 但可以确信的是 OpenSSL 里有, 你可以去找一找 解决方案二: 现在都用AES加密了 解决方案三: 去下载OpenSSL源码,里面有C实现RSA密钥生成过程,所谓的密钥长度可控是指:1024/2048,符合RSA标准的长度.

ASP.NET生成二维码的方法总结_实用技巧

本文实例总结了ASP.NET生成二维码的方法.分享给大家供大家参考,具体如下: 分享一例c#生成二维码的代码,直接引用ThoughtWorks.QRCode.dll 类生成二维码,有需要的朋友参考下. 方法1.直接引用ThoughtWorks.QRCode.dll 类,生成二维码. 代码示例: ThoughtWorks.QRCode.Codec.QRCodeEncoder encoder = new QRCodeEncoder(); encoder.QRCodeEncodeMode = QRCo

wsdl-webservices生成的源码怎么区分实体类

问题描述 webservices生成的源码怎么区分实体类 谁知道webservice的wsdl使用wsimport的cmd命令生成的源码怎么区分出来实体类的java文件,我没有C币了,求好心人解答 解决方案 这个应该很简单吧,你直接看WSDL文件,找到最下边,一般规范一点的都是最下边有一个什么什么name的,一般就是文件名...现在没法回答,等晚上看看 解决方案二: 一般查看wsdl描述文件,里面有详细的参数的说明.此外,现在流行更轻量级的json文本,这个才是当前的主流.

今天做了一个ASP计数器,放出源码吧,挺简单的!

计数器 '前天在johnny的专栏看到一个计数器,忽然想起以前我也做过~~今天就翻出来改了一下嵌入到我的BLOG中了~~放在别人的服务器上~~放出源码大家有用得着的看看吧~~如果不喜欢用图片的就改成文字得了!图片文件大家可以自己找点好看的放上! '************************调用*********************'* <script language="javascript" src="xxx.asp?max=8"></

Asp.Net生成验证码

asp.net|验证码      经常在论坛里看到有问怎么实现验证码的帖子,其实关于验证码的文章在csdn,dev-club等网站上都有很多,但是很多文章只讲诉了如何输出一个随机生成数字或字符的图象,当然了,这个是验证码的核心了,但是对很多asp.net的初学者来说,怎么使用它生成的图象又成了一个问题(论坛有不少问这个的),这也是我写本文的一个原因.    言归正传,关于验证码的原理,我就不多说了,大家可以参见其他文章,文末附有完整的实例代码,里面有详细的注释,你可以跳过解说文字,直接使用   

ASP.NET IsLine FrameWork源码公开+文章阅读索引

ASP.NET企业开发框架IsLine FrameWork系列文章已经全部发布完毕,刚刚忙完手头的其他项目,现在把这个框架源码公开,重新上传至GoogleCode,过些时候会考虑开通SVN,看时间了,大家一起交流吧! IsLine FrameWork,它不是行业业务架构,但可以作为程序员开发项目的套件,使用这套底层套件开发系统,可以简化代码,提高代码质量.ILFW主要包括DataProvider.AppLogProvider.ExceptionProcessProvider.HttpConten

关于生成java源码的问题

问题描述 最近要做一个通过java源码生成另一套java源码,如根据以下代码:publicclasshelloword{publicStringtest="";publicvoidtest(){/*语句...*/}publicStringtest(){/*语句...*/returnresult;}} 生成如下代码:publicclasshelloword{publicStringtest="";publicvoidtest(){}publicStringtest()