一款簡潔漂亮的驗證碼,代碼也簡單明了,首先寫個生成驗證碼方法的類然后在Action中調用,在頁面中以圖片的方式顯示即可,最終效果
1.用到的生成驗證碼的類
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Web; namespace PageDemo.Models { public class ValidateCode { /// <summary>
/// 生成簡潔漂亮的圖形驗證碼 /// </summary>
/// <param name="Code">傳出驗證碼</param>
/// <param name="CodeLength">驗證碼長度</param>
/// <param name="Width">生成驗證碼圖片的寬度</param>
/// <param name="Height">生成驗證碼圖片的高度</param>
/// <param name="FontSize">驗證碼字符大小</param>
/// <returns></returns>
public static byte[] CreateValidateGraphic(out String Code, int CodeLength, int Width, int Height, int FontSize) { String sCode = String.Empty; //顏色列表,用於驗證碼、噪線、噪點
Color[] oColors ={ System.Drawing.Color.Black, System.Drawing.Color.Red, System.Drawing.Color.Blue, System.Drawing.Color.Green, System.Drawing.Color.Orange, System.Drawing.Color.Brown, System.Drawing.Color.Brown, System.Drawing.Color.DarkBlue }; //字體列表,用於驗證碼
string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; //驗證碼的字元集,去掉了一些容易混淆的字符
char[] oCharacter = { '2','3','4','5','6','8','9', 'A','B','C','D','E','F','G','H','J','K', 'L','M','N','P','R','S','T','W','X','Y' }; Random oRnd = new Random(); Bitmap oBmp = null; Graphics oGraphics = null; int N1 = 0; System.Drawing.Point oPoint1 = default(System.Drawing.Point); System.Drawing.Point oPoint2 = default(System.Drawing.Point); string sFontName = null; Font oFont = null; Color oColor = default(Color); //生成驗證碼字串
for (N1 = 0; N1 <= CodeLength - 1; N1++) { sCode += oCharacter[oRnd.Next(oCharacter.Length)]; } oBmp = new Bitmap(Width, Height); oGraphics = Graphics.FromImage(oBmp); oGraphics.Clear(System.Drawing.Color.White); try { for (N1 = 0; N1 <= 4; N1++) { //畫噪線
oPoint1.X = oRnd.Next(Width); oPoint1.Y = oRnd.Next(Height); oPoint2.X = oRnd.Next(Width); oPoint2.Y = oRnd.Next(Height); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2); } float spaceWith = 0, dotX = 0, dotY = 0; if (CodeLength != 0) { spaceWith = (Width - FontSize * CodeLength - 10) / CodeLength; } for (N1 = 0; N1 <= sCode.Length - 1; N1++) { //畫驗證碼字串
sFontName = oFontNames[oRnd.Next(oFontNames.Length)]; oFont = new Font(sFontName, FontSize, FontStyle.Italic); oColor = oColors[oRnd.Next(oColors.Length)]; dotY = (Height - oFont.Height) / 2 + 2;//中心下移2像素
dotX = Convert.ToSingle(N1) * FontSize + (N1 + 1) * spaceWith; oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), dotX, dotY); } for (int i = 0; i <= 30; i++) { //畫噪點
int x = oRnd.Next(oBmp.Width); int y = oRnd.Next(oBmp.Height); Color clr = oColors[oRnd.Next(oColors.Length)]; oBmp.SetPixel(x, y, clr); } Code = sCode; //保存圖片數據
MemoryStream stream = new MemoryStream(); oBmp.Save(stream, ImageFormat.Jpeg); //輸出圖片流
return stream.ToArray(); } finally { oGraphics.Dispose(); } } } }
2.Action中的調用
public ActionResult GetImg() { int width = 100; int height = 40; int fontsize = 20; string code = string.Empty; byte[] bytes = ValidateCode.CreateValidateGraphic(out code, 4, width, height, fontsize); Session["ValidateCode"] = code; return File(bytes, @"image/jpeg"); }
3.視圖中的顯示
<img id="GL_StandardCode" style="cursor: pointer;" src="@Url.Action("GetImg", "Home")?t=@DateTime.Now.Ticks" title="看不清,點擊換一張" />
js刷新圖片驗證碼
$("#GL_StandardCode").click(function () { var newSrc = "@Url.Action("GetImg", "ValidateCode")" + "?t=" + (new Date()).getTime(); this.src=newSrc; return false; });
4提交前的驗證
public bool CheckValidateCode(string num) { string cnum = Session["ValidateCode"] == null ? "" : Session["ValidateCode"].ToString(); if (num.ToLower() == cnum.ToLower()&& !string.IsNullOrEmpty(num)) { return true; } else { return false; } }