你的位置:首页 > ASP.net教程

[ASP.net教程]c# 验证码类


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  }}