近日,为公司做网站,需要使用到验证码。于是到网络上搜索了一下,并没有发现特别满意的源代码,CSDN上的还可以,但蝈蝈不给呀() 。没有办法,只有自己动手了。
例:
下面是源程序,一般都有注释。没有必要再说了吧。
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));
}
}
}
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));
}
}
}