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 = ;
/// <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# 验证码类的更多相关文章
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- THINKPHP源码学习--------验证码类
TP3.2验证码类的理解 今天在学习中用到了THINKPHP验证码,为了了解究竟,就开始阅读TP验证码的源码. 源码位置:./ThinkPHP/Library/Think/Verify.class.p ...
- ThinkPHP 3.2.3 加减乘法验证码类
ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Ver ...
- 一个漂亮的php验证码类(分享)
直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRS ...
- 【个人使用.Net类库】(4)验证码类
验证码是现在管理系统常用的一种保护用户帐户信息的一种功能. 验证码可以有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,虽然这可能是我们登录麻烦一点,但是对用户的密码安全来 ...
- PHP编写的图片验证码类文件分享方法
适用于自定义的验证码类! <?php/* * To change this license header, choose License Headers in Project Propertie ...
- PHP之验证码类
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/6/20 * Time: 14:29 */ Class c ...
- laravel加入验证码类几种方法 && Laravel引入第三方库的方法
1,使用require , inlcude 的方法将验证码类文件包含进来,再进行new 2,将验证码类文件放于Http目录下面,也就是和控制器controller放在一个目录下面,在验证码类文件中加上 ...
- 一个好用的PHP验证码类
分享一个好用的php验证码类,包括调用示例. 说明: 如果不适用指定的字体,那么就用imagestring()函数,如果需要遇到指定的字体,就要用到imagettftext()函数.字体的位置在C盘下 ...
- 简单实用的PHP验证码类
一个简单实用的php验证码类,分享出来 ,供大家参考. 代码如下: <?php /** @ php 验证码类 @ http://www.jbxue.com */ Class code { var ...
随机推荐
- 自动化测试selenium+java 环境搭建
1.开发环境: a:安装jdk,配置java的环境变量 b:安装eclipse 工具.火狐浏览器(低版本) 2.下载selenium包 selenium-java-2.44.0.jar seleniu ...
- Functional testing - python, selenium and django
Functional testing - python selenium django - Source Code : from selenium import webdriverfrom sele ...
- Flask——route
Flask——route 关于路由flask中有三种方法(例子)处理: flask.Flask.route 装饰器(关于装饰器可以参考该文),这时最常见的使用方法,在装饰器的参数中加入想要的路由即可, ...
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念
原文出处:http://www.cnblogs.com/jacklu/p/4646601.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...
- CodeForces 689C Mike and Chocolate Thieves (二分)
原题: Description Bad news came to Mike's village, some thieves stole a bunch of chocolates from the l ...
- BootLoader 详解(2)
BootLoader的stage1 1.基本的硬件初始化 这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通 常包括以下 ...
- call_user_func函数
<?php function funa($b,$c) { echo $b; echo $c; } call_user_func('funa', "111","222 ...
- [2015hdu多校联赛补题]hdu5372 Segment Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5372 题意:进行n次操作,操作分两种,0和1,每一个0操作按出现顺序有一个编号(从1开始 0操作 0 ...
- openssl命令用法
openssl命令 配置文件:/etc/pki/tls/openssl.cnf 命令格式: openssl command [ command_opts ] [ command_args ] 众多子命 ...
- 【译】RabbitMQ:"Hello World"
简介 RabbitMQ是一个消息代理.从本质上讲,它从消息生产者处接收消息,然后传递给消息的消费者.它在消息的生产者和消费者之间根据你指定的规则对消息进行路由.缓存和持久化. RabbitMQ通常使用 ...