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 = 4;
/// <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 = 18;
/// <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 = 2;
/// <summary>
/// 前景噪点数量(默认为2)
/// </summary>
public
int
ForeNoisePointCount
{
get
{
return
this
.foreNoisePointCount; }
set
{
this
.foreNoisePointCount = value; }
}
#endregion
#region 随机码的旋转角度
/// <summary>
/// 随机码的旋转角度
/// </summary>
private
int
randomAngle = 45;
/// <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 = 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 GetImage()
{
Bitmap result =
null
;
//创建绘图
result =
new
Bitmap(
this
.verifyCodeText.Length * 16, 25);
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 - 3,
this
.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(12, 12);
objGraphics.RotateTransform(angle);
objGraphics.DrawString(chars[i].ToString(), objFont, objSolidBrush, -2, 2, 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), 1, 1);
}
}
}
#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#验证码的更多相关文章
- .net点选验证码实现思路分享
哈哈好久没冒泡了,最进看见点选验证码有点意思,所以想自己写一个. 先上效果图 如果你被这个效果吸引了就请继续看下去. 贴代码前先说点思路: 1.要有一个汉字库,并按字形分类.(我在数据库里是安部首分类 ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- TODO:Laravel增加验证码
TODO:Laravel增加验证码1. 先聊聊验证码是什么,有什么作用?验证码(CAPTCHA)是"Completely Automated Public Turing test to te ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- 随手记_C#验证码
前言 最近在网上偶然看见一个验证码,觉得很有意思,于是搜了下,是使用第三方实现的,先看效果: 总体来说效果还是可以的,官方提供的SDK也比较详细,可配置性很高.在这里在简单啰嗦几句使用方式: 使用步骤 ...
- WPF做12306验证码点击效果
一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...
- 零OCR基础6行代码实现C#验证码识别
这两天因为工作需要,要到某个网站采集信息,一是要模拟登陆,二是要破解验证码,本想用第三方付费打码,但是想想网上免费的代码也挺多的,于是乎准备从网上撸点代码下来,谁知道,撸了好多个都不行,本人以前也没接 ...
- ASP.NET中画图形验证码
context.Response.ContentType = "image/jpeg"; //生成随机的中文验证码 string yzm = "人口手大小多少上中下男女天 ...
- asp.net mvc 验证码
效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...
- ecshop验证码
<?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...
随机推荐
- .NET生成PDF文件
C#未借助第三方组件,自己封装通用类,生成PDF文件. 调用方式: //路径 string path = @"C:\yuannwu22.pdf"; //内容 string strC ...
- 容易被忽略的两个方法:onSaveInstanceState()和onRestoreInstanceState()
onSaveInstanceState()和onRestoreInstanceState()两个方法,在Activity中是比较容易忽视的方法,但是不得不说还是比较好用的方法,onSaveInstan ...
- js基础知识之_函数
javascript函数 函数概念 将完成某一特定功能的代码集合起来,可以重复使用 白话函数理解-函数就是一个工厂,帮大家实现某一个功能 优点 -时程序更加简洁 -逻辑更有条例 -调用方便 -维护更加 ...
- Gulp-入门教程 搭配环境
之前一直听朋友谈起gulp,但没有使用过,最近有机会接触到,现在给大家分享下,不对的地方还请指正.我一直以为互相分享是学习的一种好方式.下面进入正题: 首先来了解下gulp,最起码要知道:我们为什么要 ...
- Windows7 QT5.6.0(64位)使用mysql(64位)环境搭建详解
1 说明 使用环境为:Windows7 VS2015 QT5.6.0(64位),MYSQL 5.7.13(64位). 网上各种错误.模糊.抽象的资料,配置环境花了半天,痛定思痛,总结出来,方便后来人. ...
- Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)
到此处可以去下载依赖包:http://hc.apache.org/downloads.cgi import java.util.List; import org.apache.http.HttpSta ...
- Java学习----接口
1. interface关键字 2. 接口中的方法全部是抽象方法,不能被实例 3. 接口中的成员变量: public static final 4. 当子类实现接口的时候,必须覆盖接口中所有的方法 / ...
- thinkphp中表有前缀名的时候申明模板的方法
$Model=new \Home\Model\Stu_activityModel; $Model=D('Stu_activity');//错误的声明不了
- BOM 之 window
BOM 之 window 对象 在网页中定义的任何一个对象,变量和函数,都以 window 作为其 Global 对象,因此有权访问别的方法和属性 var age = 26; functi ...
- Linux下安装gcc 、g++ 、gfortran编译器
一.ubuntu下gcc/g++/gfortran的安装 1.安装 (1).gcc ubuntu下自带gcc编译器.可以通过“gcc -v”命令来查看是否安装. (2).g++ 安装g++编译器,可以 ...