<td> <label>验证码:</label> <input class="code" id="CheckCode" type="text" size="5" runat="server" /> <a href="#" style="outline:none" title="点击更换验证码" onclick="document.getElementById('getcode').src='Image.aspx?temp='+ (new Date().getTime().toString(36)); return false"> <span><img src="image.aspx" id="getcode" alt="" width="75" height="24" /> </span></a> </td>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing; public partial class Image : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string str_ValidateCode = RndNum(4); // 用于验证的Session Session["ValidateCode"] = str_ValidateCode; CreateImages(str_ValidateCode); } /// <summary> /// 生成验证字符 /// </summary> /// <param name="checkCode"></param> private void CreateImages(string checkCode) { int iwidth = (int)(checkCode.Length * 15); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23); Graphics g = Graphics.FromImage(image); g.Clear(Color.White); //定义颜色 //Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; /,修改定义颜色数组个数,去掉橙色, Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Brown, Color.DarkCyan, Color.Purple }; //定义字体 string[] font = {"Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体"}; Random rand = new Random(); //随机输出噪点 for (int i = 0; i < 50; i++) { int x = rand.Next(image.Width); int y = rand.Next(image.Height); g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); } //输出不同字体和颜色的验证码字符 for (int i = 0; i < checkCode.Length; i++) { int cindex = rand.Next(6);//小于7,输出的个数小于定义的字体数组个数 int findex = rand.Next(5);//小于5 Font f = new System.Drawing.Font(font[findex], 13, System.Drawing.FontStyle.Bold);//下标为5的字体,13 Brush b = new System.Drawing.SolidBrush(c[cindex]);//颜色为pruple int ii = 6; if ((i + 1) % 2 == 0) { ii = 4; } g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 16), ii);//字符串,文本样式,背景文理,x,y坐标 } //画一个边框 g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width-1 , image.Height-1); //输出到浏览器 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); HttpContext.Current.Response.ClearContent(); //Response.ClearContent(); HttpContext.Current.Response.ContentType = "image/Jpeg"; HttpContext.Current.Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } /// <summary> /// 生成随机字符 /// </summary> /// <param name="VcodeNum">验证码的个数</param> /// <returns></returns> private string RndNum(int VcodeNum) { //string Vchar = "1,2,3,4,5,6,7,8,9"; string Vchar = "1"; //Vchar += ",a,b,c,d,e,f,g,h,i,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z"; //Vchar += ",A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z"; Vchar += ",i,j,l,r"; Vchar += ",I,J,L,R"; string[] VcArray = Vchar.Split(','); string VNum = ""; //由于字符串很短,就不用StringBuilder了 int temp = -1; //记录上次随机数值,尽量避免生产几个一样的随机数 //采用一个简单的算法以保证生成随机数的不同 Random rand = new Random(); for (int i = 1; i < VcodeNum + 1; i++) { if (temp != -1) { rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks)); } int t = rand.Next(VcArray.Length); if (temp != -1 && temp == t) { return RndNum(VcodeNum); } temp = t; VNum += VcArray[t]; } return VNum; } }