using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Web;
namespace Demo
{
    /// <summary>
    /// Captcha
    /// </summary>
    public class Captcha
    {
        #region Private Field
        /// <summary>
        /// 随机种子
        /// </summary>
        private Random objRandom = new Random();
        #endregion
        #region Public Property
        #region 验证码长度
        /// <summary>
        /// 验证码长度
        /// </summary>
        private int length = 4;
        /// <summary>
        /// 验证码长度(默认为4)
        /// </summary>
        public int Length
        {
            get return this.length; }
            set this.length = value; }
        }
        #endregion
        #region 验证码字符串
        /// <summary>
        /// 验证码字符串
        /// </summary>
        private string verifyCodeText = null;
        /// <summary>
        /// 验证码字符串
        /// </summary>
        public string VerifyCodeText
        {
            get return this.verifyCodeText; }
            set this.verifyCodeText = value; }
        }
        #endregion
        #region 是否加入小写字母
        /// <summary>
        /// 是否加入小写字母
        /// </summary>
        private bool addLowerLetter = false;
        /// <summary>
        /// 是否加入小写字母(不包括o)
        /// </summary>
        public bool AddLowerLetter
        {
            get return this.addLowerLetter; }
            set this.addLowerLetter = value; }
        }
        #endregion
        #region 是否加入大写字母
        /// <summary>
        /// 是否加入大写字母
        /// </summary>
        private bool addUpperLetter = false;
        /// <summary>
        /// 是否加入大写字母(不包括O)
        /// </summary>
        public bool AddUpperLetter
        {
            get return this.addUpperLetter; }
            set this.addUpperLetter = value; }
        }
        #endregion
        #region 字体大小
        /// <summary>
        /// 字体大小
        /// </summary>
        private int fontSize = 18;
        /// <summary>
        /// 字体大小(默认为18)
        /// </summary>
        public int FontSize
        {
            get return this.fontSize; }
            set this.fontSize = value; }
        }
        #endregion
        #region 字体颜色
        /// <summary>
        /// 字体颜色
        /// </summary>
        private Color fontColor = Color.Blue;
        /// <summary>
        /// 字体颜色(默认为Blue)
        /// </summary>
        public Color FontColor
        {
            get return this.fontColor; }
            set this.fontColor = value; }
        }
        #endregion
        #region 字体类型
        /// <summary>
        /// 字体类型
        /// </summary>
        private string fontFamily = "Verdana";
        /// <summary>
        /// 字体类型(默认为Verdana)
        /// </summary>
        public string FontFamily
        {
            get return this.fontFamily; }
            set this.fontFamily = value; }
        }
        #endregion
        #region 背景色
        /// <summary>
        /// 背景色
        /// </summary>
        private Color backgroundColor = Color.AliceBlue;
        /// <summary>
        /// 背景色(默认为AliceBlue)
        /// </summary>
        public Color BackgroundColor
        {
            get return this.backgroundColor; }
            set this.backgroundColor = value; }
        }
        #endregion
        #region 前景噪点数量
        /// <summary>
        /// 前景噪点数量
        /// </summary>
        private int foreNoisePointCount = 2;
        /// <summary>
        /// 前景噪点数量(默认为2)
        /// </summary>
        public int ForeNoisePointCount
        {
            get return this.foreNoisePointCount; }
            set this.foreNoisePointCount = value; }
        }
        #endregion
        #region 随机码的旋转角度
        /// <summary>
        /// 随机码的旋转角度
        /// </summary>
        private int randomAngle = 45;
        /// <summary>
        /// 随机码的旋转角度(默认为40度)
        /// </summary>
        public int RandomAngle
        {
            get return this.randomAngle; }
            set this.randomAngle = value; }
        }
        #endregion
        #endregion
        #region Constructor Method
        /// <summary>
        /// 构造方法
        /// </summary>
        public Captcha()
        {
            this.GetText();
        }
        #endregion
        #region Private Method
        /// <summary>
        /// 得到验证码字符串
        /// </summary>
        private void GetText()
        {
            //没有外部输入验证码时随机生成
            if (String.IsNullOrEmpty(this.verifyCodeText))
            {
                StringBuilder objStringBuilder = new StringBuilder();
                //加入数字1-9
                for (int i = 1; i <= 9; i++)
                {
                    objStringBuilder.Append(i.ToString());
                }
                //加入大写字母A-Z,不包括O
                if (this.addUpperLetter)
                {
                    char temp = ' ';
                    for (int i = 0; i < 26; i++)
                    {
                        temp = Convert.ToChar(i + 65);
                        //如果生成的字母不是'O'
                        if (!temp.Equals('O'))
                        {
                            objStringBuilder.Append(temp);
                        }
                    }
                }
                //加入小写字母a-z,不包括o
                if (this.addLowerLetter)
                {
                    char temp = ' ';
                    for (int i = 0; i < 26; i++)
                    {
                        temp = Convert.ToChar(i + 97);
                        //如果生成的字母不是'o'
                        if (!temp.Equals('o'))
                        {
                            objStringBuilder.Append(temp);
                        }
                    }
                }
                //生成验证码字符串
                {
                    int index = 0;
                    for (int i = 0; i < length; i++)
                    {
                        index = objRandom.Next(0, objStringBuilder.Length);
                        this.verifyCodeText += objStringBuilder[index];
                        objStringBuilder.Remove(index, 1);
                    }
                }
            }
        }
        /// <summary>
        /// 得到验证码图片
        /// </summary>
        private Bitmap GetImage()
        {
            Bitmap result = null;
            //创建绘图
            result = new Bitmap(this.verifyCodeText.Length * 16, 25);
            using (Graphics objGraphics = Graphics.FromImage(result))
            {
                objGraphics.SmoothingMode = SmoothingMode.HighQuality;
                //清除整个绘图面并以指定背景色填充
                objGraphics.Clear(this.backgroundColor);
                //创建画笔
                using (SolidBrush objSolidBrush = new SolidBrush(this.fontColor))
                {
                    this.AddForeNoisePoint(result);
                    this.AddBackgroundNoisePoint(result, objGraphics);
                    //文字居中
                    StringFormat objStringFormat = new StringFormat(StringFormatFlags.NoClip);
                    objStringFormat.Alignment = StringAlignment.Center;
                    objStringFormat.LineAlignment = StringAlignment.Center;
                    //字体样式
                    Font objFont = new Font(this.fontFamily, objRandom.Next(this.fontSize - 3, this.fontSize), FontStyle.Regular);
                    //验证码旋转,防止机器识别
                    char[] chars = this.verifyCodeText.ToCharArray();
                    for (int i = 0; i < chars.Length; i++)
                    {
                        //转动的度数
                        float angle = objRandom.Next(-this.randomAngle, this.randomAngle);
                        objGraphics.TranslateTransform(12, 12);
                        objGraphics.RotateTransform(angle);
                        objGraphics.DrawString(chars[i].ToString(), objFont, objSolidBrush, -2, 2, objStringFormat);
                        objGraphics.RotateTransform(-angle);
                        objGraphics.TranslateTransform(2, -12);
                    }
                }
            }
            return result;
        }
        /// <summary>
        /// 添加前景噪点
        /// </summary>
        /// <param name="objBitmap"></param>
        private void AddForeNoisePoint(Bitmap objBitmap)
        {
            for (int i = 0; i < objBitmap.Width * this.foreNoisePointCount; i++)
            {
                objBitmap.SetPixel(objRandom.Next(objBitmap.Width), objRandom.Next(objBitmap.Height), this.fontColor);
            }
        }
        /// <summary>
        /// 添加背景噪点
        /// </summary>
        /// <param name="objBitmap"></param>
        /// <param name="objGraphics"></param>
        private void AddBackgroundNoisePoint(Bitmap objBitmap, Graphics objGraphics)
        {
            using (Pen objPen = new Pen(Color.Azure, 0))
            {
                for (int i = 0; i < objBitmap.Width * 2; i++)
                {
                    objGraphics.DrawRectangle(objPen, objRandom.Next(objBitmap.Width), objRandom.Next(objBitmap.Height), 1, 1);
                }
            }
        }
        #endregion
        #region Public Method
        public void Output(HttpResponse objHttpResponse)
        {
            using (Bitmap objBitmap = this.GetImage())
            {
                if (objBitmap != null)
                {
                    using (MemoryStream objMS = new MemoryStream())
                    {
                        objBitmap.Save(objMS, ImageFormat.Jpeg);
                        HttpContext.Current.Response.ClearContent();
                        HttpContext.Current.Response.ContentType = "image/Jpeg";
                        HttpContext.Current.Response.BinaryWrite(objMS.ToArray());
                        HttpContext.Current.Response.Flush();
                        HttpContext.Current.Response.End();
                    }
                }
            }
        }
        #endregion
    }
}

C#验证码的更多相关文章

  1. .net点选验证码实现思路分享

    哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...

  2. 【探索】无形验证码 —— PoW 算力验证

    先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...

  3. TODO:Laravel增加验证码

    TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...

  4. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  5. 随手记_C#验证码

    前言 最近在网上偶然看见一个验证码,觉得很有意思,于是搜了下,是使用第三方实现的,先看效果: 总体来说效果还是可以的,官方提供的SDK也比较详细,可配置性很高.在这里在简单啰嗦几句使用方式: 使用步骤 ...

  6. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  7. 零OCR基础6行代码实现C#验证码识别

    这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...

  8. ASP.NET中画图形验证码

    context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...

  9. asp.net mvc 验证码

    效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...

  10. ecshop验证码

    <?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...

随机推荐

  1. 手势识别=读取手机联系人=ContentResolver-Day3

    手势识别=读取手机联系人=ContentResolverDay32 mobile3.0 手机设置向导页面完成 选择器没有做完成 样式提取完成 自定义控件的优化继续 抽取父类Activity 完成 手机 ...

  2. javascript类继承系列四(组合继承)

    原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...

  3. 案例:latch: cache buffers chains event tuning

    前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...

  4. UITableView中容易忽略的知识点

    1.取消余下的分割线 tableView.tableFooterView = UIView() 2.分割线顶格 override func viewDidLayoutSubviews() { self ...

  5. html-----003

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 一个在线的C++帮助文档网站 转载

    http://www.cplusplus.com/          //C++参考 http://www.cppreference.com/wiki/start       //C++参考 http ...

  7. Jquery 实现瀑布流功能

    实现展示地址:http://sandbox.runjs.cn/show/mbojrgag 源码地址:http://runjs.cn/code/qps1jebl 效果截图:

  8. JavaScript 输入自动完成插件

    作为web开发的一员,应该都不陌生,信息处理时,很多时候需要根据用户的输入实时反馈查询结果供其选择,这给了用户很好的人机交互体验,在各大门户网站上已经被使用的很成熟了,最近项目中用到此功能,网上有很多 ...

  9. 浅谈ListBox控件,将对象封装在listBox中,在ListBox中显示对象中某个属性,在ListBox中移除和移动信息

    大家好,俗称万事开头难,不经历风雨,怎能见彩虹.在此小编给大家带来一个自己练习的小实例,希望与大家一起分享与交流.下面进入应用场景,从SQL2008数据库取出数据,给ListBox赋值在界面并显示出来 ...

  10. 经典SQL练习题

    题目地址:http://blog.csdn.net/qaz13177_58_/article/details/5575711 1. 查询Student表中的所有记录的Sname.Ssex和Class列 ...