功能说明:
1. 可自定义字体
2. 可自定义最大字号
3. 可自定义随机旋转的角度
4. 可自定义前景随机噪色量
5. 可外部生成随机码,由VerifyCode类处理成图片
6. 可自定义数字与英文字母随机出现的比率
7. 可自定义验证码长度
8. 可自定义验证码背景色
9. 可自定义验证码色彩(噪点色同验证码色一致)
功能说明:
1. 可自定义字体
2. 可自定义最大字号
3. 可自定义随机旋转的角度
4. 可自定义前景随机噪色量
5. 可外部生成随机码,由VerifyCode类处理成图片
6. 可自定义数字与英文字母随机出现的比率
7. 可自定义验证码长度
8. 可自定义验证码背景色
9. 可自定义验证码色彩(噪点色同验证码色一致)
下载DEMO源代码
附源代码:

ValidCode
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.IO;
using System.Drawing;

public partial class ValidCode : 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();


/**//// <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;
}


验证码长度(默认4个)#region 验证码长度(默认4个)

/**//// <summary>
/// 验证码长度(默认4个)
/// </summary>
public int Length

{

get
{ return _length; }

set
{ _length = value; }
}
#endregion


字体最大尺寸(默认18)#region 字体最大尺寸(默认18)

/**//// <summary>
/// 字体最大尺寸(默认18)
/// </summary>
public int FontSize

{

get
{ return _fontSize; }

set
{ _fontSize = value; }
}
#endregion


边框(默认0 没有连框)#region 边框(默认0 没有连框)

/**//// <summary>
/// 边框(默认0 没有连框)
/// </summary>
public int Border

{

get
{ return _border; }

set
{ _border = value; }
}
#endregion


自定义背景色(默认Color.AliceBlue)#region 自定义背景色(默认Color.AliceBlue)

/**//// <summary>
/// 自定义背景色(默认Color.AliceBlue)
/// </summary>
public Color BackgroundColor

{

get
{ return _backgroundColor; }

set
{ _backgroundColor = value; }
}
#endregion


验证码色(默认Color.Blue)#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


验证码中的数字出现机率,越大出现的数字机率越大(默认10)#region 验证码中的数字出现机率,越大出现的数字机率越大(默认10)

/**//// <summary>
/// 验证码中的数字出现机率
/// </summary>
public int RateNumber

{

get
{ return _rateNumber; }

set
{ _rateNumber = value; }
}
#endregion


随机码的旋转角度(默认40度)#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


噪点数量(默认值为2)#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();
}
}
}
源码作者:zhouyu
http://max.cszi.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述