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
    }
}
目录
相关文章
|
IDE API 开发工具
拦截|篡改|伪造.NET类库中不限于public的类和方法
本文除了回顾拦截.NET类库中的方法,实现方法参数的篡改、方法返回结果的伪造,再着重介绍.NET类库中非public类及方法如何拦截。
|
3月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
6天前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
29 13
|
12天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
54 2
|
3月前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
3月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
49 0
|
5月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
7月前
|
存储 Go C#
【.NET Core】深入理解IO之File类
【.NET Core】深入理解IO之File类
111 6
|
7月前
|
存储 开发框架 缓存
【.NET Core】你真的了解HttpRuntime类吗
【.NET Core】你真的了解HttpRuntime类吗
70 0
|
8月前
|
消息中间件
.NET 中 Channel 类简单使用
`System.Threading.Channels` 提供异步生产者-消费者数据结构,用于.NET Standard上的跨平台同步。频道实现生产者/消费者模型,允许在任务间异步传递数据。简单示例展示如何创建无界和有界频道,以及多生产者和消费者共享频道的场景。频道常用于内存中的消息队列,通过控制生产者和消费者的速率来调整系统流量。