62,074
社区成员
发帖
与我相关
我的任务
分享
public partial class ValidateCode : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strKey = "";
byte[] data = this.GenerateVerifyImage(5, ref strKey);
Response.OutputStream.Write(data, 0, data.Length);
Session["Code"] = strKey;
}
public byte[] GenerateVerifyImage(int nLen, ref string strKey)
{
int nBmpWidth = 25 * nLen + 5;
int nBmpHeight = 36;
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(nBmpWidth, nBmpHeight);
// 1. 生成随机背景颜色
int nRed, nGreen, nBlue; // 背景的三元色
System.Random rd = new Random((int)System.DateTime.Now.Ticks);
nRed = 255;
nGreen = 255;
nBlue = 255;
// 2. 填充位图背景
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
graph.FillRectangle(new SolidBrush(System.Drawing.Color.FromArgb(nRed, nGreen, nBlue))
, 0
, 0
, nBmpWidth
, nBmpHeight);
// 3. 绘制干扰线条,采用比背景略深一些的颜色
int nLines = 3;
System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(nRed - 17, nGreen - 17, nBlue - 17), 2);
for (int a = 0; a < nLines; a++)
{
int x1 = rd.Next() % nBmpWidth;
int y1 = rd.Next() % nBmpHeight;
int x2 = rd.Next() % nBmpWidth;
int y2 = rd.Next() % nBmpHeight;
graph.DrawLine(pen, x1, y1, x2, y2);
}
// 采用的字符集,可以随即拓展,并可以控制字符出现的几率
string strCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 4. 循环取得字符,并绘制
string strResult = "";
for (int i = 0; i < nLen; i++)
{
int x = (i * 22 + rd.Next(3));
int y = rd.Next(4) + 1;
// 确定字体
System.Drawing.Font font = new System.Drawing.Font("Courier New",
24 + rd.Next() % 4,
System.Drawing.FontStyle.Bold);
char c = strCode[rd.Next(strCode.Length)]; // 随机获取字符
strResult += c.ToString();
// 绘制字符
graph.DrawString(c.ToString(),
font,
new SolidBrush(System.Drawing.Color.FromArgb(0, 128, 180)),
x,
y);
}
// 5. 输出字节流
System.IO.MemoryStream bstream = new System.IO.MemoryStream();
bmp.Save(bstream, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose();
graph.Dispose();
Session["Code"] = strKey = strResult;
byte[] byteReturn = bstream.ToArray();
bstream.Close();
return byteReturn;
}
}