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 = ;
/// <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 = ; /// <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 = ; /// <summary>
/// 前景噪点数量(默认为2)
/// </summary>
public int ForeNoisePointCount
{
get { return this.foreNoisePointCount; }
set { this.foreNoisePointCount = value; }
}
#endregion #region 随机码的旋转角度
/// <summary>
/// 随机码的旋转角度
/// </summary>
private int randomAngle = ; /// <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 = ; i <= ; i++)
{
objStringBuilder.Append(i.ToString());
} //加入大写字母A-Z,不包括O
if (this.addUpperLetter)
{
char temp = ' '; for (int i = ; i < ; i++)
{
temp = Convert.ToChar(i + ); //如果生成的字母不是'O'
if (!temp.Equals('O'))
{
objStringBuilder.Append(temp);
}
}
} //加入小写字母a-z,不包括o
if (this.addLowerLetter)
{
char temp = ' '; for (int i = ; i < ; i++)
{
temp = Convert.ToChar(i + ); //如果生成的字母不是'o'
if (!temp.Equals('o'))
{
objStringBuilder.Append(temp);
}
}
} //生成验证码字符串
{
int index = ; for (int i = ; i < length; i++)
{
index = objRandom.Next(, objStringBuilder.Length); this.verifyCodeText += objStringBuilder[index]; objStringBuilder.Remove(index, );
}
}
}
}
/// <summary>
/// 得到验证码图片
/// </summary>
private Bitmap GetImage()
{
Bitmap result = null; //创建绘图
result = new Bitmap(this.verifyCodeText.Length * , ); 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 - , this.fontSize), FontStyle.Regular); //验证码旋转,防止机器识别
char[] chars = this.verifyCodeText.ToCharArray(); for (int i = ; i < chars.Length; i++)
{
//转动的度数
float angle = objRandom.Next(-this.randomAngle, this.randomAngle); objGraphics.TranslateTransform(, );
objGraphics.RotateTransform(angle);
objGraphics.DrawString(chars[i].ToString(), objFont, objSolidBrush, -, , objStringFormat);
objGraphics.RotateTransform(-angle);
objGraphics.TranslateTransform(, -);
}
}
} return result;
}
/// <summary>
/// 添加前景噪点
/// </summary>
/// <param name="objBitmap"></param>
private void AddForeNoisePoint(Bitmap objBitmap)
{
for (int i = ; 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, ))
{
for (int i = ; i < objBitmap.Width * ; i++)
{
objGraphics.DrawRectangle(objPen, objRandom.Next(objBitmap.Width), objRandom.Next(objBitmap.Height), , );
}
}
}
#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. PHP-解析验证码类--学习笔记

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

  2. THINKPHP源码学习--------验证码类

    TP3.2验证码类的理解 今天在学习中用到了THINKPHP验证码,为了了解究竟,就开始阅读TP验证码的源码. 源码位置:./ThinkPHP/Library/Think/Verify.class.p ...

  3. ThinkPHP 3.2.3 加减乘法验证码类

    ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Ver ...

  4. 一个漂亮的php验证码类(分享)

    直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRS ...

  5. 【个人使用.Net类库】(4)验证码类

    验证码是现在管理系统常用的一种保护用户帐户信息的一种功能. 验证码可以有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,虽然这可能是我们登录麻烦一点,但是对用户的密码安全来 ...

  6. PHP编写的图片验证码类文件分享方法

    适用于自定义的验证码类! <?php/* * To change this license header, choose License Headers in Project Propertie ...

  7. PHP之验证码类

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/6/20 * Time: 14:29 */ Class c ...

  8. laravel加入验证码类几种方法 && Laravel引入第三方库的方法

    1,使用require , inlcude 的方法将验证码类文件包含进来,再进行new 2,将验证码类文件放于Http目录下面,也就是和控制器controller放在一个目录下面,在验证码类文件中加上 ...

  9. 一个好用的PHP验证码类

    分享一个好用的php验证码类,包括调用示例. 说明: 如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下 ...

  10. 简单实用的PHP验证码类

    一个简单实用的php验证码类,分享出来 ,供大家参考. 代码如下: <?php /** @ php 验证码类 @ http://www.jbxue.com */ Class code { var ...

随机推荐

  1. Web服务器禁止range请求

    range: 请求一般是多线程下载的客户端程序使用 在httpd.conf中增加下面的配置,可以禁止range请求: RewriteEngine onRewriteCond %{HTTP:Range} ...

  2. 苹果手机制作gif图片

    前一段介绍了一款很好用的在模拟器上录制gif图片的工具licecap(地址:http://www.cnblogs.com/10-19-92/p/5593785.html), 但是licecap不能使用 ...

  3. jquery遍历的radio的取值问题

    html页面:<c:if test="${courseStandardVos != null }"> <c:set var="index" v ...

  4. 汉诺塔算法详解之C++

    汉诺塔: 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆环,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置 ...

  5. SQL笔记-第六章,索引与约束

    一.索引 CREATE INDEX 索引名 ON 表名(字段1, 字段2,……字段n) CREATE INDEX idx_person_nameage ON T_Person(FName,FAge) ...

  6. React学习之一:React初探

    一,React简介 React是由Facebook和Instagram开发的一套创建用户界面的JavaScript库.许多人认为React是MVC中的V. React创建的目的是为了:构建数据随时会改 ...

  7. ServiceLocator 简单示例(转)

    Service Locator Pattern in C#: A Simple Example(转) Service Locator Pattern in C# with Lazy Initializ ...

  8. ios 学习总结之动画(转)

    转自:http://blog.sina.com.cn/s/blog_a85effc301012wu4.html UIView的,翻转.旋转,偏移,翻页,缩放,取反的动画效果   翻转的动画 //开始动 ...

  9. 判断Ie浏览器

    ie8以下 if(!+[1,]) if(window.attachEvent){ alert("ie")}else if(window.addEventListener){aler ...

  10. nginx限制ip连接数和带宽

    今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有.下 ...