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 ...
随机推荐
- 更多隐式Intent用法
上几篇无论是显示的Intent或者隐式的Intent,都是要跳转的自己添加指定的页面,如果想要跳转到百度首页或者跳转到联系人面板等,前面的知识显然是很不实用的.这里,将要针对其它的一些Intent用法 ...
- grunt 构建工具(build tool)初体验
操作环境:win8 系统,建议使用 git bash (window下的命令行工具) 1,安装node.js 官网下载:https://nodejs.org/ 直接点击install ,会根据你的操 ...
- angularJs 使用中遇到的问题小结【二:购物车引起的问题思考】
问题描述 :购物车引起的问题思考 业务逻辑是这样的:我商品加入购物车后,——>点击购物车图标——>进入订单列表(这里的数据只有首次会加载服务器数据,后面就不会执行控制器的方法了,这里的跳转 ...
- Nico Game Studio 3.地图纹理编辑 物体皮肤编辑
完成功能: 1.地图纹理编辑功能. 图层编辑,添加/删除纹理,地图编辑.网格绘制.
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- linux命令sed学习笔记
sed其实就是两个主要的知识点,那就是“怎么选择”和“怎么操作”!
- prmopt 提示框接收字符串,输入后按确定弹出警告框,警告内容为逆序的字符串
虽然已经找到offer,但因为公司还没安排实习,所以在学校的时间多了很多.好吧,这段时间我用来备考四级啦(好悲催,还没过),然后这一天,闲着无聊,就帮妹妹看了这样子一道题目啦. 题目内容: 编制一个从 ...
- List集合的去除重复性练习
package com.java.b.listdmeo.www; import java.util.ArrayList;import java.util.Iterator; import com.ja ...
- Fatal error: Uncaught SoapFault exception
Warning: SoapClient::SoapClient() expects parameter 2 to be array, boolean given in login\login.php ...
- CentOS6.5 yum安装桌面环境
安装原因 安装centos6.5时选择了minimal CentOS最小化安装方式 需要使用浏览器拨号连接内网 安装过程 通过yum grouplist查询在 group 软件包中,Desktop.D ...