随笔之生成简单的验证码
由于验证码应用于网站很常见,笔者在这记录下以前用到过的一种生成验证码的简单方法。
基本思路:
1..新建2个web 页面:default.aspx和CreateImage.aspx。
2.准备在CreateImage.cs文件中写2个方法,一个是Createval(int length);另一个是 CreateImg(string val)。第一个方法用来产生随机数拼成的字符串;第二个方法传入的参数是第一个方法产生的字串,并生成图片。
3.在default.aspx页面显示CreateImage.aspx产生的图片
default.aspx具体的代码如下:
View Code
<head runat="server"> <title></title> <script language="javascript" type="text/javascript" > function getimg() { //document.getElementById("imgcode").src = "CreateImage.aspx";因为src地址和img默认src相同,click之后不会改变,所以我这里加了一个date参数 document.getElementById("imgcode").src = "CreateImage.aspx?date=" + escape(new Date().getTime().toString(36)); } </script> </head> <body> <form id="form1" runat="server"> <div> <img id="imgcode" alt="" src="CreateImage.aspx" onclick="getimg()" /> <!--第二种方法 --> <a href="#" onclick="document.getElementById('imgcode').src='CreateImage.aspx?temp='+ (new Date().getTime().toString(36)); return false">产生验证码</a> </div> </form> </body>
CreateImage.cs具体代码如下:
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using System.IO; public partial class CreateImage : System.Web.UI.Page { public static string sessionkey;////此处用来保存验证码到Session的Key的名称 private const int ImageHeigth = 22; //验证码图片的高度 private const double ImageLengthBase = 12.5; //验证码图片中每个字符的宽度 private const int ImageLineNumber = 25; //噪音线的数量 private const int ImagePointNumber = 100; //噪点的数量 protected void Page_Load(object sender, EventArgs e) { string val = Createval(4); CreateImg(val); } /// <summary> /// 产生4位随即数拼成的字串 /// </summary> /// <param name="length"></param> /// <returns></returns> public string Createval(int length) { StringBuilder returnvalue = new StringBuilder (); string temp = "0123456789abcdefghijklmnopqrstuvwxyz"; Random rd = new Random(); for (int i = 0; i < length;i++ ) { returnvalue.Append(temp[rd.Next(0, 36)]); } Session[sessionkey] = returnvalue;//把生成的字串存入session中,以便在default页面比对输入的字符串是否与此处生成的相同,达到验证的作用 return returnvalue.ToString(); } /// <summary> /// 生成图片 /// </summary> /// <param name="val"></param> public void CreateImg(string val) { if (!string.IsNullOrEmpty(val)) { this.Session[sessionkey] = val; //初始化位图Bitmap对象,指定图片对象的大小(宽,高) Bitmap image = new Bitmap((int)Math.Ceiling((double)(val.Length * ImageLengthBase)), ImageHeigth); //初始化一块画布 Graphics graphics = Graphics.FromImage(image); Random random = new Random(); try { int num5; graphics.Clear(Color.White); //绘制噪音线 for (num5 = 0; num5 < ImageLineNumber; num5++) { int num = random.Next(image.Width); int num3 = random.Next(image.Height); int num2 = random.Next(image.Width); int num4 = random.Next(image.Height); graphics.DrawLine(new Pen(Color.Silver), num, num3, num2, num4); } //验证码字体样式 Font font = new Font("Tahoma", 12, FontStyle.Italic | FontStyle.Bold); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); //绘制验证码到画布 graphics.DrawString(val, font, brush, (float)2, (float)2); //绘制噪点 for (num5 = 0; num5 < ImagePointNumber; num5++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); MemoryStream stream = new MemoryStream(); //保存图片 image.Save(stream, ImageFormat.Gif); base.Response.ClearContent(); base.Response.ContentType = "image/Gif"; base.Response.BinaryWrite(stream.ToArray()); } finally { graphics.Dispose(); image.Dispose(); } } } }
特别说明:生成图片的方法我是从网上找的,仅用来学习。


浙公网安备 33010602011771号