1、验证码帮助类


namespace IdeaCore.Services.Common
{
public class ValidateCodeService : IValidateCodeService
{
private const string ValidateCodeKey = "ValidateCode";
private const double Pi2 = 6.283185307179586476925286766559;
private const string BackColor = "#dde3ec";
/// <summary>
/// 获取验证码的sessionkey
/// </summary>
/// <returns></returns>
public string GetValidateCodeKey() {
return ValidateCodeKey;
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public string CreateValidateCode(int length)
{
string code = string.Empty;
while (true)
{
var s = (Guid.NewGuid() + "").Substring(0, 1);
if (s == "1" || s == "l" || s == "o" || s == "0")
{
}
else
{
code += s;
}
if (code.Length >= length)
{
break;
}
}
return code;
}
/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="validateCode">验证码</param>
public byte[] CreateValidateGraphic(string validateCode)
{
const int fSize = 40;
const int fWidth = fSize + 8;
int imageWidth = validateCode.Length * fWidth + 4 + 8 * 2;
const int imageHeight = fSize * 2 + 8;
Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
string[] fonts = { "Arial", "Georgia" };
var image = new Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(image);
try
{
g.Clear(ColorTranslator.FromHtml(BackColor));
var rand = new Random();
////给背景添加随机生成的燥点
//Pen pen = new Pen(Color.RoyalBlue, 0);
// int c = 6 * 20; //杂点数量
// for (int i = 0; i < c; i++)
// {
// int x = rand.Next(image.Width);
// int y = rand.Next(image.Height);
// g.DrawRectangle(pen, x, y, 1, 1);
// }
const int n1 = (imageHeight - 40 - 8 * 2);
const int n2 = n1 / 4;
const int top1 = n2;
const int top2 = n2 * 2;
//随机字体和颜色的验证码字符
for (int i = 0; i < validateCode.Length; i++)
{
int cindex = rand.Next(colors.Length - 1);
int findex = rand.Next(fonts.Length - 1);
var f = new Font(fonts[findex], fSize, FontStyle.Bold);
Brush b = new SolidBrush(colors[cindex]);
var top = i % 2 == 1 ? top2 : top1;
var left = i * fWidth;
if (i == 0) { left += 8; }
g.DrawString(validateCode.Substring(i, 1), f, b, left, top);
}
//
image = TwistImage(image, true, new Random().Next(3, 10), new Random().Next(0, 6));
var stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
//输出图片流
return stream.ToArray();
}
finally
{
g.Dispose();
image.Dispose();
}
}
#region 产生波形滤镜效果
/// <summary>
/// 正弦曲线Wave扭曲图片(Edit By 51aspx.com)
/// </summary>
/// <param name="srcBmp">图片路径</param>
/// <param name="bXDir">如果扭曲则选择为True</param>
/// <param name="dMultValue"></param>
/// <param name="dPhase">波形的起始相位,取值区间[0-2*PI)</param>
/// <returns></returns>
private static Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
var destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);
// 将位图背景填充为白色
var graph = Graphics.FromImage(destBmp);
graph.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(BackColor)), 0, 0, destBmp.Width, destBmp.Height);
graph.Dispose();
double dBaseAxisLen = bXDir ? destBmp.Height : destBmp.Width;
for (int i = 0; i < destBmp.Width; i++)
{
for (int j = 0; j < destBmp.Height; j++)
{
var dx = bXDir ? (Pi2 * j) / dBaseAxisLen : (Pi2 * i) / dBaseAxisLen;
dx += dPhase;
var dy = Math.Cos(dx);
// 取得当前点的颜色
int nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
int nOldY = bXDir ? j : j + (int)(dy * dMultValue);
var color = srcBmp.GetPixel(i, j);
if (nOldX >= 0 && nOldX < destBmp.Width
&& nOldY >= 0 && nOldY < destBmp.Height)
{
destBmp.SetPixel(nOldX, nOldY, color);
}
}
}
return destBmp;
}
#endregion
}
}


2、获取验证码
/// <summary>
/// 获取验证码
/// </summary>
/// <returns></returns>
public FileContentResult GetValidateCode()
{
var code = _validateCodeService.CreateValidateCode(4);
var bytes = _validateCodeService.CreateValidateGraphic(code);
HttpContext.Session.SetString(_validateCodeService.GetValidateCodeKey(), code);
return File(bytes, @"image/jpeg");
}
3、验证验证码
/// <summary>
/// 验证验证码
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
protected bool ValidateCode(string code) {
if (string.IsNullOrEmpty(code)) {
return false;
}
var sessionCode = HttpContext.Session.GetString("ValidateCode");
return sessionCode != null && sessionCode == code.Trim();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2018-09-27 Win下必备神器之Cmder