最近做了个验证码,分享出来
在Login.aspx中放置一个TextBox(用来输入验证码),Image(是Html控件),并设置Image控件的src为gif.aspx即可。
在登录事件中:
if(Sesstion["regcode"].ToString().toLower()==textbox1.Text.ToLower())
{
验证通过...
}
在gif.aspx下:
protected void Page_Load(object sender, EventArgs e)
{
string strKey = "";
byte[] data = GenerateImage(6, ref strKey);
Session["regcode"] = strKey;
Response.OutputStream.Write(data, 0, data.Length);
}
private byte[] GenerateImage(int nLen, ref string strKey)
{
int nBmpWidth = 13 * nLen + 5;
int nBmpHeight = 25;
Bitmap bmp = new Bitmap(nBmpWidth, nBmpHeight);
//1、生成随即背景颜色
int nRed, nGreen, nBlue;
Random rd = new Random((int)DateTime.Now.Ticks);
nRed = rd.Next(255) % 128 + 128;
nGreen = rd.Next(255) % 128 + 128;
nBlue = rd.Next(255) % 128 + 128;
//2、填充位图背景
Graphics graph = Graphics.FromImage(bmp);
graph.FillRectangle(new SolidBrush(Color.FromArgb(nRed, nGreen, nBlue)), 0, 0, nBmpWidth, nBmpHeight);
//3、画图片的背景噪音线
int nLines = 10;
Pen pen = new Pen(Color.FromArgb(nRed, nGreen, nBlue));
for (int i = 0; i < nLines; i++)
{
int x1 = rd.Next() % nBmpWidth;
int y1 = rd.Next() % nBmpHeight;
int x2 = rd.Next() % nBmpWidth;
int y2 = rd.Next() % nBmpHeight;
}
//采用的字符集
string strCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//4、循环取得字符并输出
string strResult = "";
for (int i = 0; i < nLen; i++)
{
int x = (i * 13) + rd.Next(3);
int y = rd.Next(4) + 1;
//确定字体
Font font = new Font("arial", 12 + rd.Next() % 4, FontStyle.Bold);
char c = strCode[rd.Next(strCode.Length)];
strResult += c.ToString();
//绘制字符
graph.DrawString(c.ToString(), font, new SolidBrush(Color.FromArgb(nRed - 60 + y * 3, nGreen - 60 + y * 3, nBlue - 40 + y * 3)), x, y);
}
//画图片的前景噪音点
for (int i = 0; i < 10; i++)
{
int x = rd.Next(bmp.Width);
int y = rd.Next(bmp.Height);
bmp.SetPixel(x, y, Color.FromArgb(rd.Next()));
}
//画图片的边框线
graph.DrawRectangle(new Pen(Color.Silver), 0, 0, bmp.Width - 1, bmp.Height - 1);
//输出
System.IO.MemoryStream bstream = new System.IO.MemoryStream();
bmp.Save(bstream, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose();
graph.Dispose();
strKey = strResult;
byte[] byteReturn = bstream.ToArray();
bstream.Close();
return byteReturn;
}