标签:codec lin 程序 使用 img buffer stream mat []
使用C# ASP.NET 获取 验证码的代码书写
一般都采用异步 点击 前台验证码图片 请求一次 :
前台图片代码:
<img id="imgvalidatecode" src="../ashx/validatecode.ashx" alt="点击刷新" style="vertical-align: middle;" />
服务端一般处理程序: ValidateCode.ashx
public class ashx_ValidateCode : BaseHttpHandlerNo { public override void ProcessRequest(HttpContext context) { base.ProcessRequest(context); //设置页面不被缓存 Response.Buffer = true; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); Response.Expires = 0; Response.CacheControl = "no-cache"; Response.AppendHeader("Pragma", "No-Cache"); string checkCode =ValidateCode.GetRandomCode(4); Session["CheckCode"] = checkCode; ValidateCode.CreateImage(checkCode,Response); } }
注意:ValidateCode.GetRandomCode(4) 为获取验证码的主要方法。
下面就来贴出此ValidateCode类的代码:
public static string GetRandomCode(int codeCount) { string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,M,N,P,Q,R,S,T,U,W,X,Y,Z"; string[] allCharArray = allChar.Split(‘,‘); string randomCode = ""; int temp = -1; Random rand = new Random(); for (int i = 0; i < codeCount; i++) { if (temp != -1) { rand = new Random(temp * i * ((int)DateTime.Now.Ticks)); } int t = rand.Next(33); while (temp == t) { t = rand.Next(33); } temp = t; randomCode += allCharArray[t]; } return randomCode; } public static void CreateImage(string checkCode,HttpResponse response) { int iwidth = (int)(checkCode.Length * 14); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image); System.Drawing.Font f = new System.Drawing.Font("Arial ", 10);//, System.Drawing.FontStyle.Bold); System.Drawing.Brush b = new System.Drawing.SolidBrush(System.Drawing.Color.Black); System.Drawing.Brush r = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(166, 8, 8)); //g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue), 0, 0, image.Width, image.Height); //g.Clear(Color.AliceBlue);//背景色 g.Clear(System.Drawing.ColorTranslator.FromHtml("#99C1CB"));//背景色 char[] ch = checkCode.ToCharArray(); for (int i = 0; i < ch.Length; i++) { if (ch[i] >= ‘0‘ && ch[i] <= ‘9‘) { //数字用红色显示 g.DrawString(ch[i].ToString(), f, r, 3 + (i * 12), 3); } else { //字母用黑色显示 g.DrawString(ch[i].ToString(), f, b, 3 + (i * 12), 3); } } //for循环用来生成一些随机的水平线 Pen blackPen = new Pen(Color.Black, 0); Random rand = new Random(); for (int i=0;i<2;i++) { int y = rand.Next(image.Height); g.DrawLine(blackPen,0,y,image.Width,y); } System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //history back 不重复 response.Cache.SetNoStore();//这一句 response.ClearContent(); response.ContentType = "image/Jpeg"; response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); }
是不是很简单~ 中间不想要 水平线 就注释掉好了!
标签:codec lin 程序 使用 img buffer stream mat []
原文地址:http://www.cnblogs.com/longm/p/6879447.html