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. python sorted和sort

    我们需要对List进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序 方法2.用built-in函数sorted进行排序(从2.4开始) ...

  2. Farey Sequence

    Description The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rationa ...

  3. 【原】搭建Samba的简要过程

    1.安装samba yum install samba –y 2.创建用户 useradd admin #先创建系统用户 smbpasswd -a admin #第一次加入需要-a参数,把admin用 ...

  4. Chapter7: question 49 - 50

    49. 把字符串转换为整数 很多细节需要注意.(空格,符号,溢出等) Go: 8. String to Integer (atoi) 50. 树种两个结点的最低公共祖先 A. 若是二叉搜索树,直接与根 ...

  5. js实现日历卡

    效果图如下 首先先添加简单的样式 <style type="text/css"> *{padding:0;margin:0;} #tab { margin:0 auto ...

  6. 使用jquery获取url以及jquery获取url参数的方法

    使用jquery获取url以及使用jquery获取url参数是我们经常要用到的操作 1.jquery获取url很简单,代码如下 1.window.location.href; 其实只是用到了javas ...

  7. 关于隐藏input输入内容问题

    如果想通过获取焦点输入改变内容,type不能是hidden的 <input type="hidden" id="test"> // 这种是不行的,只 ...

  8. 使用 Git 管理源代码

    在现代软件开发项目中,要成为一个有效的软件开发人员,我们必须能够与其他项目贡献者并行进行开发.源代码管理(SCM)系统不是什么新思想.为了编写一些能够更快速.简单地开发以后软件项目的软件,已经进行了很 ...

  9. Python在安装第三方模块遇到的问题及解决办法

    今天在安装第一个模块psutil的时候出现了以下问题: 1.找不到Python.h文件 解决办法:重新安装python环境:sudo apt-get install python-dev 说明:网上有 ...

  10. webForm中dropDownList的一些用法

    DropDownList 控件用于创建下拉列表. DropDownList 控件中的每个可选项都是由 ListItem 元素定义的! 该控件支持数据绑定! DropDownList1.DataSour ...