随机生成验证码

登陆验证码 的随机生成代码:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Drawing;

namespace FreeProject
{
    public partial class ValidateNumber : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            VerifyCode vcode = new VerifyCode();
            vcode.CreateImage(base.Context);
            Session["VerifyCode"] = vcode.RandomCode;
        }

        public class VerifyCode
        {
            /// <summary>
            /// 验证码长度
            /// </summary>
            private int _length = 4;

            /// <summary>
            /// 字体最大尺寸
            /// </summary>
            private int _fontSize = 18;

            /// <summary>
            /// 边框,0时没有连框
            /// </summary>
            private int _border = 0;

            /// <summary>
            /// 背景色
            /// </summary>
            private Color _backgroundColor = Color.AliceBlue;

            /// <summary>
            /// 验证码色
            /// </summary>
            private Color _fontColor = Color.Blue;

            /// <summary>
            /// 验证码中的数字出现机率  ,越大出现的数字机率越大
            /// </summary>
            private int _rateNumber = 10;

            /// <summary>
            /// 随机生成的验证码
            /// </summary>
            private string _randomChars;

            /// <summary>
            /// 随机码的旋转角度
            /// </summary>
            private int _randomAngle = 40;

            /// <summary>
            /// 字体
            /// </summary>
            private string _fontFamily = "Verdana";

            /// <summary>
            /// 噪点数量,0  时不用
            /// </summary>
            private int _chaosNumber = 0;

            /// <summary>
            /// 随机种子,公用
            /// </summary>
            private Random random = new Random();

            public VerifyCode()
            {
 
            }
            ///  <summary>
            ///  噪点
            ///  </summary>
            ///  <param  name="chaosNumber">噪点</param>
            public VerifyCode(int chaosNumber)
            {
                _chaosNumber = chaosNumber;
            }

            ///  <summary>
            /// 长度,噪点
            ///  </summary>
            ///  <param  name="length">长度</param>
            ///  <param  name="chaosNumber">噪点</param>
            public VerifyCode(int length, int chaosNumber)
            {
                _length = length;
                _chaosNumber = chaosNumber;
            }

            ///  <summary>
            ///  长度,噪点,数字机率
            ///  </summary>
            ///  <param  name="length">长度</param>
            ///  <param  name="chaosNumber">噪点</param>
            ///  <param  name="rate">数字机率越大,生成的随机码中数字占的比例越多</param>
            public VerifyCode(int length, int chaosNumber, int rate)
            {
                _length = length;
                _chaosNumber = chaosNumber;
                _rateNumber = rate;
            }

            #region 验证码长度(默认4个)
            /// <summary>
            /// 验证码长度(默认4个)
            /// </summary>
            public int Length
            {
                get { return _length; }
                set { _length = value; }
            }
            #endregion

            #region  字体最大尺寸(默认18)
            /// <summary>
            /// 字体最大尺寸(默认18)
            /// </summary>
            public int FontSize
            {
                get { return _fontSize; }
                set { _fontSize = value; }
            }
            #endregion

            #region  边框(默认0  没有连框)
            /// <summary>
            /// 边框(默认0  没有连框)
            /// </summary>
            public int Border
            {
                get { return _border; }
                set { _border = value; }
            }
            #endregion

            #region  自定义背景色(默认Color.AliceBlue)
            /// <summary>
            /// 自定义背景色(默认Color.AliceBlue)
            /// </summary>
            public Color BackgroundColor
            {
                get { return _backgroundColor; }
                set { _backgroundColor = value; }
            }
            #endregion

            #region  验证码色(默认Color.Blue)
            /// <summary>
            /// 验证码色(默认Color.Blue)
            /// </summary>
            public Color FontColor
            {
                get { return _fontColor; }
                set { _fontColor = value; }
            }
            #endregion

            #region  随机生成的验证码
            /// <summary>
            /// 随机生成的验证码
            /// </summary>
            public string RandomCode
            {
                get { return _randomChars; }
                set { _randomChars = value.ToUpper(); }
            }
            #endregion

            #region  验证码中的数字出现机率,越大出现的数字机率越大(默认10)
            /// <summary>
            /// 验证码中的数字出现机率
            /// </summary>
            public int RateNumber
            {
                get { return _rateNumber; }
                set { _rateNumber = value; }
            }
            #endregion

            #region  随机码的旋转角度(默认40度)
            /// <summary>
            /// 随机码的旋转角度(默认40度)
            /// </summary>
            public int RandomAngle
            {
                get { return _randomAngle; }
                set { _randomAngle = value; }
            }
            #endregion

            #region  字体
            /// <summary>
            /// 字体
            /// </summary>
            public string FontFamily
            {
                get { return _fontFamily; }
                set { _fontFamily = value; }
            }
            #endregion

            #region  噪点数量(默认值为2)
            /// <summary>
            /// 噪点数量(默认值为2)
            /// </summary>
            public int ChaosNumber
            {
                get { return _chaosNumber; }
                set { _chaosNumber = value; }
            }
            #endregion

            ///  <summary>
            ///  生成随机验证码
            ///  </summary>
            private void CreateCode()
            {
                //有外部输入验证码时不用产生,否则随机生成
                if (!string.IsNullOrEmpty(_randomChars))
                { return; }

                char code;
                for (int i = 0; i < _length; i++)
                {
                    int rand = random.Next();
                    if (rand % _rateNumber == 0)
                    { code = (char)('A' + (char)(rand % 26)); }
                    else
                    { code = (char)('0' + (char)(rand % 10)); }
                    _randomChars += code.ToString();
                }

                //Response.Cookies.Add(new HttpCookie("ValidCode", _randomChars));
            }

            ///  <summary>
            ///  背景噪点生成
            ///  </summary>
            ///  <param  name="graph"></param>
            private void CreateBackgroundChaos(Bitmap map, Graphics graph)
            {
                Pen blackPen = new Pen(Color.Azure, 0);
                for (int i = 0; i < map.Width * 2; i++)
                {
                    int x = random.Next(map.Width);
                    int y = random.Next(map.Height);
                    graph.DrawRectangle(blackPen, x, y, 1, 1);
                }
            }

            ///  <summary>
            ///  前景色噪点
            ///  </summary>
            ///  <param  name="map"></param>
            private void CreaetForeChaos(Bitmap map)
            {
                for (int i = 0; i < map.Width * _chaosNumber; i++)
                {
                    int x = random.Next(map.Width);
                    int y = random.Next(map.Height);
                    //map.SetPixel(x,  y,  Color.FromArgb(random.Next(300)));
                    map.SetPixel(x, y, _fontColor);
                }
            }

            ///  <summary>
            ///  创建随机码图片
            ///  </summary>
            ///  <param  name="context"></param>
            public void CreateImage(HttpContext context)
            {
                CreateCode();          //创建验证码

                Bitmap map = new Bitmap((int)(_randomChars.Length * 15), 24);                            //创建图片背景
                Graphics graph = Graphics.FromImage(map);
                //graph.FillRectangle(new  SolidBrush(Color.Black),  0,  0,  map.Width+1,  map.Height+1);          //填充一个有背景的矩形

                //if  (_border  >  0)  //画一个边框
                //{
                //        graph.DrawRectangle(new  Pen(Color.Black,  0),  0,  0,  map.Width  -  _border,  map.Height  -  _border);
                //}       
                //graph.SmoothingMode  =  System.Drawing.Drawing2D.SmoothingMode.AntiAlias;        //模式

                graph.Clear(_backgroundColor);              //清除画面,填充背景
                SolidBrush brush = new SolidBrush(_fontColor);    //画笔
                Point dot = new Point(12, 12);

                //CreateBackgroundChaos(map,graph);              //背景噪点生成

                CreaetForeChaos(map);              //前景色噪点

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

                //验证码旋转,防止机器识别
                char[] chars = _randomChars.ToCharArray();            //拆散字符串成单字符数组
                for (int i = 0; i < chars.Length; i++)
                {
                    Font fontstyle = new Font(_fontFamily, random.Next(_fontSize - 3, _fontSize), FontStyle.Regular);            //字体样式
                    float angle = random.Next(-_randomAngle, _randomAngle);            //转动的度数

                    graph.TranslateTransform(dot.X, dot.Y);          //移动光标到指定位置
                    graph.RotateTransform(angle);
                    graph.DrawString(chars[i].ToString(), fontstyle, brush, -2, 2, format);
                    graph.RotateTransform(-angle);                    //转回去
                    graph.TranslateTransform(2, -dot.Y);          //移动光标到指定位置
                }


                //生成图片
                MemoryStream ms = new MemoryStream();
                map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
                context.Response.ClearContent();
                context.Response.ContentType = "image/gif";
                context.Response.BinaryWrite(ms.ToArray());
                graph.Dispose();
                map.Dispose();
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值