Asp.net生成验证码的类

简介: using System;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using System.Web;

namespace WanJia.CommonUtility
{
     ///   <summary>
    
///  VerifyCode
    
///   </summary>
     public  class VerifyCode
    {
         #region Private Field & Public Property
         // 随机种子
         private Random objRandom =  new Random();

         #region 验证码长度
         // 验证码长度
         private  int length =  4;

         ///   <summary>
        
///  验证码长度(默认为4)
        
///   </summary>
         public  int Length
        {
             get {  return  this.length; }
             set {  this.length = value; }
        }
         #endregion

         #region 验证码字符串
         // 验证码字符串
         private  string verifyCodeText =  null;

         ///   <summary>
        
///  验证码字符串
        
///   </summary>
         public  string VerifyCodeText
        {
             get {  return  this.verifyCodeText; }
             set {  this.verifyCodeText = value; }
        }
         #endregion

         #region 是否加入小写字母
         // 是否加入小写字母
         private  bool addLowerLetter =  false;

         ///   <summary>
        
///  是否加入小写字母(不包括o)
        
///   </summary>
         public  bool AddLowerLetter
        {
             get {  return  this.addLowerLetter; }
             set {  this.addLowerLetter = value; }
        }
         #endregion

         #region 是否加入大写字母
         // 是否加入大写字母
         private  bool addUpperLetter =  false;

         ///   <summary>
        
///  是否加入大写字母(不包括O)
        
///   </summary>
         public  bool AddUpperLetter
        {
             get {  return  this.addUpperLetter; }
             set {  this.addUpperLetter = value; }
        }
         #endregion

         #region 字体大小
         // 字体大小
         private  int fontSize =  18;

         ///   <summary>
        
///  字体大小(默认为18)
        
///   </summary>
         public  int FontSize
        {
             get {  return  this.fontSize; }
             set {  this.fontSize = value; }
        }
         #endregion

         #region 字体颜色
         // 字体颜色
         private Color fontColor = Color.Blue;

         ///   <summary>
        
///  字体颜色(默认为Blue)
        
///   </summary>
         public Color FontColor
        {
             get {  return  this.fontColor; }
             set {  this.fontColor = value; }
        }
         #endregion

         #region 字体类型
         // 字体类型
         private  string fontFamily =  " Verdana ";

         ///   <summary>
        
///  字体类型(默认为Verdana)
        
///   </summary>
         public  string FontFamily
        {
             get {  return  this.fontFamily; }
             set {  this.fontFamily = value; }
        }
         #endregion

         #region 背景色
         // 背景色
         private Color backgroundColor = Color.AliceBlue;

         ///   <summary>
        
///  背景色(默认为AliceBlue)
        
///   </summary>
         public Color BackgroundColor
        {
             get {  return  this.backgroundColor; }
             set {  this.backgroundColor = value; }
        }
         #endregion

         #region 前景噪点数量
         // 前景噪点数量
         private  int foreNoisePointCount =  2;

         ///   <summary>
        
///  前景噪点数量(默认为2)
        
///   </summary>
         public  int ForeNoisePointCount
        {
             get {  return  this.foreNoisePointCount; }
             set {  this.foreNoisePointCount = value; }
        }
         #endregion

         #region 随机码的旋转角度
         // 随机码的旋转角度
         private  int randomAngle =  40;

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

         #region Constructor Method
         public VerifyCode()
        {
             this.GetVerifyCodeText();
        }
         #endregion

         #region Private Method
         ///   <summary>
        
///  得到验证码字符串
        
///   </summary>
         private  void GetVerifyCodeText()
        {
             // 没有外部输入验证码时随机生成
             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 GetVerifyCodeImage()
        {
            Bitmap result =  null;

             // 创建绘图
            result =  new Bitmap( this.verifyCodeText.Length *  1625);

             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 -  3this.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( 1212);
                        objGraphics.RotateTransform(angle);
                        objGraphics.DrawString(chars[i].ToString(), objFont, objSolidBrush, - 22, 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),  11);
                }
            }

        }
         #endregion

         #region Public Method
         ///   <summary>
        
///  输出验证码图片
        
///   </summary>
        
///   <param name="objHttpResponse"> Http响应实例 </param>
        
///   <returns> 输出是否成功 </returns>
         public  bool OutputImage(HttpResponse objHttpResponse)
        {
             bool result =  false;

             using (Bitmap objBitmap =  this.GetVerifyCodeImage())
            {
                 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();

                        result =  true;
                    }
                }
            }

             return result;
        }
         #endregion
    }
}
目录
相关文章
|
12月前
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
拦截|篡改|伪造.NET类库中不限于public的类和方法
|
1月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
3月前
|
存储 Go C#
【.NET Core】深入理解IO之File类
【.NET Core】深入理解IO之File类
53 6
|
3月前
|
存储 开发框架 缓存
【.NET Core】你真的了解HttpRuntime类吗
【.NET Core】你真的了解HttpRuntime类吗
29 0
|
4月前
|
消息中间件
.NET 中 Channel 类简单使用
`System.Threading.Channels` 提供异步生产者-消费者数据结构,用于.NET Standard上的跨平台同步。频道实现生产者/消费者模型,允许在任务间异步传递数据。简单示例展示如何创建无界和有界频道,以及多生产者和消费者共享频道的场景。频道常用于内存中的消息队列,通过控制生产者和消费者的速率来调整系统流量。
|
4月前
|
SQL 数据库连接 数据库
VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤
VB.NET 中使用SqlConnection类连接到Microsoft SQL Server数据库的详细步骤
219 0
|
开发框架 前端开发 .NET
ASP.NET Core 基础知识之​Startup 类配置
Startup 类配置服务和应用的请求管道。
135 0
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
156 0
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
233 0
|
JSON 前端开发 测试技术
记录一次net.sf.json包下面的JSONObject类踩到的坑
记录一次net.sf.json包下面的JSONObject类踩到的坑
418 0