Created
December 25, 2009 02:53
-
-
Save earthday/263481 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Data; | |
using System.Configuration; | |
using System.Collections; | |
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.Drawing; | |
public partial class UserControls_GetVerifyImage : System.Web.UI.Page | |
{ | |
protected void Page_Load(object sender, EventArgs e) | |
{ | |
string strKey = ""; | |
byte[] data = GenerateVerifyImage(5, ref strKey); | |
Session["VerifyNumber"] = strKey; | |
Response.OutputStream.Write(data, 0, data.Length); | |
} | |
private static byte[] GenerateVerifyImage(int nLen, ref string strKey) | |
{ | |
int nBmpWidth = 13 * nLen + 5; | |
int nBmpHeight = 25; | |
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 = rd.Next(255) % 128 + 128; | |
nGreen = rd.Next(255) % 128 + 128; | |
nBlue = rd.Next(255) % 128 + 128; | |
// 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 = "2345678abcdefghijkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; | |
// 4. 循环取得字符,并绘制 | |
string strResult = ""; | |
for (int i = 0; i < nLen; i++) | |
{ | |
int x = (i * 13 + rd.Next(3)); | |
int y = rd.Next(4) + 1; | |
// 确定字体 | |
System.Drawing.Font font = new System.Drawing.Font("Courier New", | |
12 + 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(nRed - 60 + y * 3, nGreen - 60 + y * 3, nBlue - 40 + y * 3)), | |
x, | |
y); | |
} | |
// 5. 输出字节流 | |
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment