近日,为公司做网站,需要使用到验证码。于是到网络上搜索了一下,并没有发现特别满意的源代码,上的还可以,但蝈蝈不给呀() 。没有办法,只有自己动手了。
例:
下面是源程序,一般都有注释。没有必要再说了吧。
using System; using System.Data; using System.Configuration; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Web.SessionState; using System.Drawing; using System.Drawing.Imaging; public partial class ValidateCode : System.Web.UI.Page ... { /**//// <summary> /// 验证码长度 /// </summary> private int codeLen = 6; /**//// <summary> /// 图片宽度 /// </summary> private int imgWidth = 200; /**//// <summary> /// 图片高度 /// </summary> private int imgHeight = 35; /**//// <summary> /// 字体大小 /// </summary> private int fontSize = 18; /**//// <summary> /// 干扰度(百分之几) /// </summary> private int fineness = 1; protected void Page_Load(object sender, EventArgs e) ...{ Response.Expires = 0; string validateCode = CreateValidateCode(); Bitmap bitmap = new Bitmap(imgWidth, imgHeight); //给图像设置干扰 DisturbBitmap(bitmap); //绘制验证码图像 DrawValidateCode(bitmap, validateCode); //保存验证码图像,等待输出 bitmap.Save(Response.OutputStream, ImageFormat.Jpeg); } /**//// <summary> /// 随机生成验证码,并保存到SESSION中 /// </summary> /// <returns></returns> private string CreateValidateCode() ...{ string validateCode = ""; Random random = new Random(); string tmp = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; for (int i = 0; i < codeLen; i++) ...{ int n = random.Next(tmp.Length); validateCode += tmp[n]; } Session["ValidateCode"] = validateCode; return validateCode; } /**//// <summary> /// 为图片设置干扰点 /// </summary> /// <param name="bitmap"></param> private void DisturbBitmap(Bitmap bitmap) ...{ Random rand = new Random(); int iRed = rand.Next(200, 255); int iGreen = rand.Next(200, 255); int iBlue = rand.Next(200, 255); int iAlpha = rand.Next(0, 100); // 通过随机数生成 Random random = new Random(); for (int i = 0; i < bitmap.Width; i++) ...{ for (int j = 0; j < bitmap.Height; j++) ...{ if (random.Next(100) <= this.fineness) ...{ //设置干扰点 iAlpha = rand.Next(0, 100); iRed = rand.Next(50, 150); iGreen = rand.Next(50, 150); iBlue = rand.Next(50, 150); bitmap.SetPixel(i, j, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); } else ...{ //绘制背景色 iAlpha = rand.Next(0, 100); iRed = rand.Next(240, 255); iGreen = rand.Next(200, 255); iBlue = rand.Next(200, 255); bitmap.SetPixel(i, j, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); } } } //画边框 iAlpha = rand.Next(0, 100); iRed = rand.Next(0, 0); iGreen = rand.Next(0, 255); iBlue = rand.Next(0, 255); for (int i = 0; i < bitmap.Width; i++) ...{ bitmap.SetPixel(i, 0, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(i, 1, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(i, bitmap.Height - 1, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(i, bitmap.Height - 2, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); } for (int i = 0; i < bitmap.Height; i++) ...{ bitmap.SetPixel(0, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(1, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(bitmap.Width - 1, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); bitmap.SetPixel(bitmap.Width - 2, i, Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); } } /**//// <summary> /// 绘制验证码图片 /// </summary> /// <param name="bitmap"></param> /// <param name="validateCode"></param> private void DrawValidateCode(Bitmap bitmap, string validateCode) ...{ //随机获取颜色 Random rand = new Random(); int iRed = rand.Next(0, 50); int iGreen = rand.Next(0, 50); int iBlue = rand.Next(0, 50); int iAlpha = rand.Next(50, 100); char[] chr = validateCode.ToCharArray(); for (int i = 0; i < codeLen; i++) ...{ Font f = new Font(new FontFamily("Microsoft Sans Serif"), fontSize, FontStyle.Bold | FontStyle.Italic); Brush b = new SolidBrush(Color.FromArgb(iAlpha, iRed, iGreen, iBlue)); Graphics g = Graphics.FromImage(bitmap); //设置各字符的漂浮范围 int iX, iY; iX = rand.Next(-5, 5); iY = rand.Next(-5, 5); //绘制验证码图像 g.DrawString(chr[i].ToString(), f, b, (float)((bitmap.Width / codeLen) * (i) + iX), (float)(bitmap.Height / 2 - g.MeasureString(chr[i].ToString(), f).Height / 2 + iY)); } }}