登陆验证码 的随机生成代码:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.IO;
using System.Drawing;
namespace FreeProject
{
public partial class ValidateNumber : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
VerifyCode vcode = new VerifyCode();
vcode.CreateImage(base.Context);
Session["VerifyCode"] = vcode.RandomCode;
}
public class VerifyCode
{
/// <summary>
/// 验证码长度
/// </summary>
private int _length = 4;
/// <summary>
/// 字体最大尺寸
/// </summary>
private int _fontSize = 18;
/// <summary>
/// 边框,0时没有连框
/// </summary>
private int _border = 0;
/// <summary>
/// 背景色
/// </summary>
private Color _backgroundColor = Color.AliceBlue;
/// <summary>
/// 验证码色
/// </summary>
private Color _fontColor = Color.Blue;
/// <summary>
/// 验证码中的数字出现机率 ,越大出现的数字机率越大
/// </summary>
private int _rateNumber = 10;
/// <summary>
/// 随机生成的验证码
/// </summary>
private string _randomChars;
/// <summary>
/// 随机码的旋转角度
/// </summary>
private int _randomAngle = 40;
/// <summary>
/// 字体
/// </summary>
private string _fontFamily = "Verdana";
/// <summary>
/// 噪点数量,0 时不用
/// </summary>
private int _chaosNumber = 0;
/// <summary>
/// 随机种子,公用
/// </summary>
private Random random = new Random();
public VerifyCode()
{
}
/// <summary>
/// 噪点
/// </summary>
/// <param name="chaosNumber">噪点</param>
public VerifyCode(int chaosNumber)
{
_chaosNumber = chaosNumber;
}
/// <summary>
/// 长度,噪点
/// </summary>
/// <param name="length">长度</param>
/// <param name="chaosNumber">噪点</param>
public VerifyCode(int length, int chaosNumber)
{
_length = length;
_chaosNumber = chaosNumber;
}
/// <summary>
/// 长度,噪点,数字机率
/// </summary>
/// <param name="length">长度</param>
/// <param name="chaosNumber">噪点</param>
/// <param name="rate">数字机率越大,生成的随机码中数字占的比例越多</param>
public VerifyCode(int length, int chaosNumber, int rate)
{
_length = length;
_chaosNumber = chaosNumber;
_rateNumber = rate;
}
#region 验证码长度(默认4个)
/// <summary>
/// 验证码长度(默认4个)
/// </summary>
public int Length
{
get { return _length; }
set { _length = value; }
}
#endregion
#region 字体最大尺寸(默认18)
/// <summary>
/// 字体最大尺寸(默认18)
/// </summary>
public int FontSize
{
get { return _fontSize; }
set { _fontSize = value; }
}
#endregion
#region 边框(默认0 没有连框)
/// <summary>
/// 边框(默认0 没有连框)
/// </summary>
public int Border
{
get { return _border; }
set { _border = value; }
}
#endregion
#region 自定义背景色(默认Color.AliceBlue)
/// <summary>
/// 自定义背景色(默认Color.AliceBlue)
/// </summary>
public Color BackgroundColor
{
get { return _backgroundColor; }
set { _backgroundColor = value; }
}
#endregion
#region 验证码色(默认Color.Blue)
/// <summary>
/// 验证码色(默认Color.Blue)
/// </summary>
public Color FontColor
{
get { return _fontColor; }
set { _fontColor = value; }
}
#endregion
#region 随机生成的验证码
/// <summary>
/// 随机生成的验证码
/// </summary>
public string RandomCode
{
get { return _randomChars; }
set { _randomChars = value.ToUpper(); }
}
#endregion
#region 验证码中的数字出现机率,越大出现的数字机率越大(默认10)
/// <summary>
/// 验证码中的数字出现机率
/// </summary>
public int RateNumber
{
get { return _rateNumber; }
set { _rateNumber = value; }
}
#endregion
#region 随机码的旋转角度(默认40度)
/// <summary>
/// 随机码的旋转角度(默认40度)
/// </summary>
public int RandomAngle
{
get { return _randomAngle; }
set { _randomAngle = value; }
}
#endregion
#region 字体
/// <summary>
/// 字体
/// </summary>
public string FontFamily
{
get { return _fontFamily; }
set { _fontFamily = value; }
}
#endregion
#region 噪点数量(默认值为2)
/// <summary>
/// 噪点数量(默认值为2)
/// </summary>
public int ChaosNumber
{
get { return _chaosNumber; }
set { _chaosNumber = value; }
}
#endregion
/// <summary>
/// 生成随机验证码
/// </summary>
private void CreateCode()
{
//有外部输入验证码时不用产生,否则随机生成
if (!string.IsNullOrEmpty(_randomChars))
{ return; }
char code;
for (int i = 0; i < _length; i++)
{
int rand = random.Next();
if (rand % _rateNumber == 0)
{ code = (char)('A' + (char)(rand % 26)); }
else
{ code = (char)('0' + (char)(rand % 10)); }
_randomChars += code.ToString();
}
//Response.Cookies.Add(new HttpCookie("ValidCode", _randomChars));
}
/// <summary>
/// 背景噪点生成
/// </summary>
/// <param name="graph"></param>
private void CreateBackgroundChaos(Bitmap map, Graphics graph)
{
Pen blackPen = new Pen(Color.Azure, 0);
for (int i = 0; i < map.Width * 2; i++)
{
int x = random.Next(map.Width);
int y = random.Next(map.Height);
graph.DrawRectangle(blackPen, x, y, 1, 1);
}
}
/// <summary>
/// 前景色噪点
/// </summary>
/// <param name="map"></param>
private void CreaetForeChaos(Bitmap map)
{
for (int i = 0; i < map.Width * _chaosNumber; i++)
{
int x = random.Next(map.Width);
int y = random.Next(map.Height);
//map.SetPixel(x, y, Color.FromArgb(random.Next(300)));
map.SetPixel(x, y, _fontColor);
}
}
/// <summary>
/// 创建随机码图片
/// </summary>
/// <param name="context"></param>
public void CreateImage(HttpContext context)
{
CreateCode(); //创建验证码
Bitmap map = new Bitmap((int)(_randomChars.Length * 15), 24); //创建图片背景
Graphics graph = Graphics.FromImage(map);
//graph.FillRectangle(new SolidBrush(Color.Black), 0, 0, map.Width+1, map.Height+1); //填充一个有背景的矩形
//if (_border > 0) //画一个边框
//{
// graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - _border, map.Height - _border);
//}
//graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //模式
graph.Clear(_backgroundColor); //清除画面,填充背景
SolidBrush brush = new SolidBrush(_fontColor); //画笔
Point dot = new Point(12, 12);
//CreateBackgroundChaos(map,graph); //背景噪点生成
CreaetForeChaos(map); //前景色噪点
//文字距中
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
//验证码旋转,防止机器识别
char[] chars = _randomChars.ToCharArray(); //拆散字符串成单字符数组
for (int i = 0; i < chars.Length; i++)
{
Font fontstyle = new Font(_fontFamily, random.Next(_fontSize - 3, _fontSize), FontStyle.Regular); //字体样式
float angle = random.Next(-_randomAngle, _randomAngle); //转动的度数
graph.TranslateTransform(dot.X, dot.Y); //移动光标到指定位置
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), fontstyle, brush, -2, 2, format);
graph.RotateTransform(-angle); //转回去
graph.TranslateTransform(2, -dot.Y); //移动光标到指定位置
}
//生成图片
MemoryStream ms = new MemoryStream();
map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/gif";
context.Response.BinaryWrite(ms.ToArray());
graph.Dispose();
map.Dispose();
}
}
}
}