C# · 12月 30, 2021

理解C#生成验证码的过程

本文实例为大家介绍了生成验证码的详细过程,供大家参考,具体内容如下

生成验证码的类:

using System;using System.Collections.Generic;using System.Drawing;using System.Text;namespace Controllers.Core.Util{ /// <summary> /// 验证码 /// </summary> public class VerifyCodeHelper : AdminBaseController { #region 变量 /// <summary> /// 颜色表 /// </summary> private static Color[] colors = new Color[]{ Color.FromArgb(220,20,60),Color.FromArgb(128,128),Color.FromArgb(65,105,225),Color.FromArgb(70,130,180),Color.FromArgb(46,139,87),Color.FromArgb(184,134,11),Color.FromArgb(255,140,0),Color.FromArgb(139,69,19),Color.FromArgb(0,191,255),Color.FromArgb(95,158,160),147),165,0)}; /// <summary> /// 字体表 /// </summary> private static string[] fonts = new string[] { “Arial”,”Verdana”,”Georgia”,”黑体” }; /// <summary> /// 字体大小 /// </summary> private static int fontSize = 22; #endregion #region 生成验证码图片 /// <summary> /// 生成验证码图片 /// </summary> public static Bitmap CreateVerifyCodeBmp(out string code) { int width = 120; int height = 40; Bitmap bmp = new Bitmap(width,height); Graphics g = Graphics.FromImage(bmp); Random rnd = new Random(); //背景色 g.FillRectangle(new SolidBrush(Color.White),new Rectangle(0,width,height)); //文字 StringBuilder sbCode = new StringBuilder(); for (int i = 0; i < 4; i++) { string str = GetChar(rnd); Font font = GetFont(rnd); Color color = GetColor(rnd); g.DrawString(str,font,new SolidBrush(color),new PointF((float)(i * width / 4.0),0)); sbCode.Append(str); } code = sbCode.ToString(); //噪音线 for (int i = 0; i < 10; i++) { int x1 = rnd.Next(bmp.Width); int x2 = rnd.Next(bmp.Width); int y1 = rnd.Next(bmp.Height); int y2 = rnd.Next(bmp.Height); Pen p = new Pen(GetColor(rnd),1); g.DrawLine(p,x1,y1,x2,y2); } //扭曲 bmp = TwistImage(bmp,true,3,rnd.NextDouble() * Math.PI * 2); g = Graphics.FromImage(bmp); //噪点 for (int i = 0; i < 100; i++) { int x1 = rnd.Next(bmp.Width); int y1 = rnd.Next(bmp.Height); Pen p = new Pen(GetColor(rnd),1); g.DrawRectangle(p,1,1); } //边框 g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(153,153,153))),width – 1,height – 1)); return bmp; } #endregion #region 获取随机字符 /// <summary> /// 获取随机字符 /// </summary> private static string GetChar(Random rnd) { int n = rnd.Next(0,61); if (n <= 9) { return ((char)(48 + n)).ToString(); } else if (n <= 35) { return ((char)(65 + n – 10)).ToString(); } else { return ((char)(97 + n – 36)).ToString(); } } #endregion #region 获取随机字体 /// <summary> /// 获取随机字体 /// </summary> private static Font GetFont(Random rnd) { return new Font(fonts[rnd.Next(0,fonts.Length)],fontSize,FontStyle.Bold); } #endregion #region 获取随机颜色 /// <summary> /// 获取随机颜色 /// </summary> private static Color GetColor(Random rnd) { return colors[rnd.Next(0,colors.Length)]; } #endregion #region 正弦曲线Wave扭曲图片 /// <summary> /// 正弦曲线Wave扭曲图片(Edit By 51aspx.com) /// </summary> /// <param name=”srcBmp”>图片路径</param> /// <param name=”bXDir”>如果扭曲则选择为True</param> /// <param name=”nMultValue”>波形的幅度倍数,越大扭曲的程度越高,一般为3</param> /// <param name=”dPhase”>波形的起始相位,取值区间[0-2*PI)</param> private static System.Drawing.Bitmap TwistImage(Bitmap srcBmp,bool bXDir,double dMultValue,double dPhase) { System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width,srcBmp.Height); // 将位图背景填充为白色 System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp); graph.FillRectangle(new SolidBrush(System.Drawing.Color.White),destBmp.Width,destBmp.Height); graph.Dispose(); double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width; for (int i = 0; i < destBmp.Width; i++) { for (int j = 0; j < destBmp.Height; j++) { double dx = 0; dx = bXDir ? (Math.PI * 2 * (double)j) / dBaseAxisLen : (Math.PI * 2 * (double)i) / dBaseAxisLen; dx += dPhase; double dy = Math.Sin(dx); // 取得当前点的颜色 int nOldX = 0,nOldY = 0; nOldX = bXDir ? i + (int)(dy * dMultValue) : i; nOldY = bXDir ? j : j + (int)(dy * dMultValue); System.Drawing.Color color = srcBmp.GetPixel(i,j); if (nOldX >= 0 && nOldX < destBmp.Width && nOldY >= 0 && nOldY < destBmp.Height) { destBmp.SetPixel(nOldX,nOldY,color); } } } return destBmp; } #endregion }}

验证码页面Action:

public ActionResult VerifyCode(){ string code; Bitmap bmp = VerifyCodeHelper.CreateVerifyCodeBmp(out code); Bitmap newbmp = new Bitmap(bmp,108,36); HttpContext.Session[“VerifyCode”] = code; Response.Clear(); Response.ContentType = “image/bmp”; newbmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Bmp); return View();}

说明:前台页面为空的cshtml页面,验证码的值放在Session中。

使用验证码的页面:

显示验证码的img:

<img id=”verifyCode” src=”” alt=”验证码” style=”vertical-align: middle;” />
页面加载完成后,显示验证码(注意,要加上时间戳,不然刷新页面时验证码不刷新):

$(function () { //刷新验证码 $(“#refreshVerifyCode”).click(function () { refreshVerifyCode(); //刷新验证码 }); $(“#verifyCode”).click(function () { refreshVerifyCode(); //刷新验证码 }); refreshVerifyCode();});

刷新验证码:

//刷新验证码function refreshVerifyCode() { $(“#verifyCode”).attr(“src”,”VerifyCode?t=” + new Date().valueOf());}

判断用户输入的文本是否与验证码相同的Action:

public ActionResult CheckVCode(string vcode){ if (HttpContext.Session[“VerifyCode”].ToString().ToLower() == vcode.ToLower()) { Dictionary<string,object> dic = new Dictionary<string,object>(); dic[“ok”] = true; return Content(JsonConvert.SerializeObject(dic)); } else { Dictionary<string,object>(); dic[“ok”] = false; return Content(JsonConvert.SerializeObject(dic)); }}

以上就是本文的全部内容,希望对大家学习C#生成验证码的方法有所帮助。