使用YZMHelper帮助类即可

using System;
using System.Web;
using System.Drawing;
using System.Security.Cryptography; namespace ProjectWenDangManage.Framework
{
/// <summary>
/// 验证码类
/// </summary>
public class Rand
{
#region 生成随机数字
/// <summary>
/// 生成随机数字
/// </summary>
/// <param name="length">生成长度</param>
public static string Number(int Length)
{
return Number(Length, false);
} /// <summary>
/// 生成随机数字
/// </summary>
/// <param name="Length">生成长度</param>
/// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
public static string Number(int Length, bool Sleep)
{
if (Sleep) System.Threading.Thread.Sleep();
string result = "";
System.Random random = new Random();
for (int i = ; i < Length; i++)
{
result += random.Next().ToString();
}
return result;
}
#endregion #region 生成随机字母与数字
/// <summary>
/// 生成随机字母与数字
/// </summary>
/// <param name="IntStr">生成长度</param>
public static string Str(int Length)
{
return Str(Length, false);
} /// <summary>
/// 生成随机字母与数字
/// </summary>
/// <param name="Length">生成长度</param>
/// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
public static string Str(int Length, bool Sleep)
{
if (Sleep) System.Threading.Thread.Sleep();
char[] Pattern = new char[] { '', '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
string result = "";
int n = Pattern.Length;
System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
for (int i = ; i < Length; i++)
{
int rnd = random.Next(, n);
result += Pattern[rnd];
}
return result;
}
#endregion #region 生成随机纯字母随机数
/// <summary>
/// 生成随机纯字母随机数
/// </summary>
/// <param name="IntStr">生成长度</param>
public static string Str_char(int Length)
{
return Str_char(Length, false);
} /// <summary>
/// 生成随机纯字母随机数
/// </summary>
/// <param name="Length">生成长度</param>
/// <param name="Sleep">是否要在生成前将当前线程阻止以避免重复</param>
public static string Str_char(int Length, bool Sleep)
{
if (Sleep) System.Threading.Thread.Sleep();
char[] Pattern = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
string result = "";
int n = Pattern.Length;
System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
for (int i = ; i < Length; i++)
{
int rnd = random.Next(, n);
result += Pattern[rnd];
}
return result;
}
#endregion
} /// <summary>
/// 验证图片类
/// </summary>
public class YZMHelper
{
#region 私有字段
private string text;
private Bitmap image;
private int letterCount = ; //验证码位数
private int letterWidth = ; //单个字体的宽度范围
private int letterHeight = ; //单个字体的高度范围
private static byte[] randb = new byte[];
private static RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();
private Font[] fonts =
{
new Font(new FontFamily("Times New Roman"), +Next(),System.Drawing.FontStyle.Regular),
new Font(new FontFamily("Georgia"), + Next(),System.Drawing.FontStyle.Regular),
new Font(new FontFamily("Arial"), + Next(),System.Drawing.FontStyle.Regular),
new Font(new FontFamily("Comic Sans MS"), + Next(),System.Drawing.FontStyle.Regular)
};
#endregion #region 公有属性
/// <summary>
/// 验证码
/// </summary>
public string Text
{
get { return this.text; }
} /// <summary>
/// 验证码图片
/// </summary>
public Bitmap Image
{
get { return this.image; }
}
#endregion #region 构造函数
public YZMHelper()
{
HttpContext.Current.Response.Expires = ;
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-);
HttpContext.Current.Response.AddHeader("pragma", "no-cache");
HttpContext.Current.Response.CacheControl = "no-cache";
this.text = Rand.Number();
CreateImage();
}
#endregion #region 私有方法
/// <summary>
/// 获得下一个随机数
/// </summary>
/// <param name="max">最大值</param>
private static int Next(int max)
{
rand.GetBytes(randb);
int value = BitConverter.ToInt32(randb, );
value = value % (max + );
if (value < ) value = -value;
return value;
} /// <summary>
/// 获得下一个随机数
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
private static int Next(int min, int max)
{
int value = Next(max - min) + min;
return value;
}
#endregion #region 公共方法
/// <summary>
/// 绘制验证码
/// </summary>
public void CreateImage()
{
int int_ImageWidth = this.text.Length * letterWidth;
Bitmap image = new Bitmap(int_ImageWidth, letterHeight);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
for (int i = ; i < ; i++)
{
int x1 = Next(image.Width - );
int x2 = Next(image.Width - );
int y1 = Next(image.Height - );
int y2 = Next(image.Height - );
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
int _x = -, _y = ;
for (int int_index = ; int_index < this.text.Length; int_index++)
{
_x += Next(, );
_y = Next(-, );
string str_char = this.text.Substring(int_index, );
str_char = Next() == ? str_char.ToLower() : str_char.ToUpper();
Brush newBrush = new SolidBrush(GetRandomColor());
Point thePos = new Point(_x, _y);
g.DrawString(str_char, fonts[Next(fonts.Length - )], newBrush, thePos);
}
for (int i = ; i < ; i++)
{
int x = Next(image.Width - );
int y = Next(image.Height - );
image.SetPixel(x, y, Color.FromArgb(Next(, ), Next(, ), Next(, )));
}
image = TwistImage(image, true, Next(, ), Next(, ));
g.DrawRectangle(new Pen(Color.LightGray, ), , , int_ImageWidth - , (letterHeight - ));
this.image = image;
} /// <summary>
/// 字体随机颜色
/// </summary>
public Color GetRandomColor()
{
Random RandomNum_First = new Random((int)DateTime.Now.Ticks);
System.Threading.Thread.Sleep(RandomNum_First.Next());
Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);
int int_Red = RandomNum_First.Next();
int int_Green = RandomNum_Sencond.Next();
int int_Blue = (int_Red + int_Green > ) ? : - int_Red - int_Green;
int_Blue = (int_Blue > ) ? : int_Blue;
return Color.FromArgb(int_Red, int_Green, int_Blue);
} /// <summary>
/// 正弦曲线Wave扭曲图片
/// </summary>
/// <param name="srcBmp">图片路径</param>
/// <param name="bXDir">如果扭曲则选择为True</param>
/// <param name="nMultValue">波形的幅度倍数,越大扭曲的程度越高,一般为3</param>
/// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
public System.Drawing.Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
double PI = 6.283185307179586476925286766559;
Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
Graphics graph = Graphics.FromImage(destBmp);
graph.FillRectangle(new SolidBrush(Color.White), , , destBmp.Width, destBmp.Height);
graph.Dispose();
double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;
for (int i = ; i < destBmp.Width; i++)
{
for (int j = ; j < destBmp.Height; j++)
{
double dx = ;
dx = bXDir ? (PI * (double)j) / dBaseAxisLen : (PI * (double)i) / dBaseAxisLen;
dx += dPhase;
double dy = Math.Sin(dx);
int nOldX = , nOldY = ;
nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
nOldY = bXDir ? j : j + (int)(dy * dMultValue); Color color = srcBmp.GetPixel(i, j);
if (nOldX >= && nOldX < destBmp.Width
&& nOldY >= && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
}
srcBmp.Dispose();
return destBmp;
}
#endregion
}
}

YZMHelper

使用例子

 //实例化YZMHelper
YZMHelper y = new YZMHelper();
//然后通过CreateImage()绘制验证码
y.CreateImage();
//通过y.Text得到产生的验证码
TempData["Yzm"] = y.Text;
//通过y.Image得到产生的验证码图片
System.Drawing.Bitmap b = y.Image;
//将验证码突破保存到知道路径下
b.Save(path, System.Drawing.Imaging.ImageFormat.Png);

C#生成随机验证码的更多相关文章

  1. Java生成随机验证码

    package com.tg.snail.core.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  2. Python 生成随机验证码

    Python生成随机验证码  Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fro ...

  3. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  4. Python使用PIL模块生成随机验证码

    PIL模块的安装 pip3 install pillow 生成随机验证码图片 import random from PIL import Image, ImageDraw, ImageFont fro ...

  5. C#生成随机验证码例子

    C#生成随机验证码例子: 前端: <tr> <td width=" align="center" valign="top"> ...

  6. pillow实例 | 生成随机验证码

    1 PIL(Python Image Library) PIL是Python进行基本图片处理的package,囊括了诸如图片的剪裁.缩放.写入文字等功能.现在,我便以生成随机验证码为例,讲述PIL的基 ...

  7. Django中生成随机验证码(pillow模块的使用)

    Django中生成随机验证码 1.html中a标签的设置 <img src="/get_validcode_img/" alt=""> 2.view ...

  8. struts2生成随机验证码图片

    之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来! 首先是生成随机验证码图片的action: ...

  9. js用正则表达式验证用户和密码的安全性,生成随机验证码

    制作了一个表单,表单验证用户.密码.随机验证码 html页面

随机推荐

  1. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  2. Atitit apache 和guava的反射工具

    Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache  34             7 ...

  3. C#并行编程-Parallel

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  4. vuejs切换视图同时保持状态

    vuejs切换视图同时保持状态 http://cn.vuejs.org/guide/components.html#动态组件 动态组件 多个组件可以使用同一个挂载点,然后动态地在它们之间切换.使用保留 ...

  5. jQuery贪吃蛇--jQuery学习

    我用JQuery有一段时间了,越来越体会到其强大之处,于是自己尝试写了一个贪吃蛇小游戏,拿来与网友分享一下. 1. 了解JQuery.Timers 除用到了jQuery1.5.1之外,我还用到了jQu ...

  6. dic+css页面布局分享

    HTML部分代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  7. 基于asp.net+MINIUI的项目----在线学习系统

    1 数据库列的自动计算: 描述:一张选课表,其中有学习的开始时间和结束时间,一个列用来计算学习的总时间(小时) 解决:选择该列 属性:计算列规范:公式:(datediff(hour,[StartTim ...

  8. switch判断注意点

    if判断,如果判断的两个值类型不同,会继续隐性转换,==,当然如果使用===就不会. 1 if(2=="2"){ 2 console.log("true"); ...

  9. linux-redis

    1.下载 6.启动 ./redis-server ../conf/redis.conf 7.测试 ./redis-cli -p 7030 set str "hello" ./red ...

  10. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...