using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace WebApplication1.驗(yàn)證碼 { /// <summary> /// 完美隨機(jī)驗(yàn)證碼 0.10 /// Verion:0.10 /// Description:隨機(jī)生成設(shè)定驗(yàn)證碼,,并隨機(jī)旋轉(zhuǎn)一定角度,字體顏色不同 /// </summary>
public class ValidateCode : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { string randomcode = this.CreateRandomCode(4); Session["ValidateCode"] = randomcode; //ViewState["ValidateCode"] = randomcode; this.CreateImage(randomcode);
}
/// <summary> /// 生成隨機(jī)碼 /// </summary> /// <param name="length">隨機(jī)碼個(gè)數(shù)</param> /// <returns></returns> private string CreateRandomCode(int length) { int rand; char code; string randomcode = String.Empty;
//生成一定長度的驗(yàn)證碼 System.Random random = new Random(); for(int i=0;i<length;i++) { rand = random.Next();
if(rand%3 == 0) { code = (char)('A' + (char)(rand%26)); } else { code = (char)('0' + (char)(rand%10)); }
randomcode += code.ToString(); } return randomcode; } /// <summary> /// 創(chuàng)建隨機(jī)碼圖片 /// </summary> /// <param name="randomcode">隨機(jī)碼</param> private void CreateImage(string randomcode) { int randAngle = 45; //隨機(jī)轉(zhuǎn)動角度 int mapwidth = (int)(randomcode.Length * 23); Bitmap map = new Bitmap(mapwidth,28);//創(chuàng)建圖片背景 Graphics graph = Graphics.FromImage(map); graph.Clear(Color.AliceBlue);//清除畫面,,填充背景 graph.DrawRectangle(new Pen(Color.Black,0),0,0,map.Width-1,map.Height-1);//畫一個(gè)邊框 //graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//模式
Random rand = new Random();
//背景噪點(diǎn)生成 Pen blackPen = new Pen(Color.LightGray,0); for (int i=0;i<50;i++) { int x = rand.Next(0,map.Width); int y = rand.Next(0,map.Height); graph.DrawRectangle(blackPen,x,y,1,1); }
//驗(yàn)證碼旋轉(zhuǎn),,防止機(jī)器識別 char[] chars = randomcode.ToCharArray();//拆散字符串成單字符數(shù)組
//文字距中 StringFormat format = new StringFormat(StringFormatFlags.NoClip); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center;
//定義顏色 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //定義字體 string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" };
for(int i=0;i<chars.Length;i++) { int cindex = rand.Next(7); int findex = rand.Next(5);
Font f = new System.Drawing.Font(font[findex],13,System.Drawing.FontStyle.Bold);//字體樣式(參數(shù)2為字體大小) Brush b = new System.Drawing.SolidBrush(c[cindex]);
Point dot = new Point(16,16); //graph.DrawString(dot.X.ToString(),fontstyle,new SolidBrush(Color.Black),10,150);//測試X坐標(biāo)顯示間距的 float angle = rand.Next(-randAngle,randAngle);//轉(zhuǎn)動的度數(shù)
graph.TranslateTransform(dot.X,dot.Y);//移動光標(biāo)到指定位置 graph.RotateTransform(angle); graph.DrawString(chars[i].ToString(),f,b,1,1,format); //graph.DrawString(chars[i].ToString(),fontstyle,new SolidBrush(Color.Blue),1,1,format); graph.RotateTransform(-angle);//轉(zhuǎn)回去 graph.TranslateTransform(2,-dot.Y);//移動光標(biāo)到指定位置 } //graph.DrawString(randomcode,fontstyle,new SolidBrush(Color.Blue),2,2); //標(biāo)準(zhǔn)隨機(jī)碼 //生成圖片 System.IO.MemoryStream ms = new System.IO.MemoryStream(); map.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/gif"; Response.BinaryWrite(ms.ToArray()); graph.Dispose(); map.Dispose(); }
#region Web 窗體設(shè)計(jì)器生成的代碼 override protected void OnInit(EventArgs e) { // // CODEGEN: 該調(diào)用是 ASP.NET Web 窗體設(shè)計(jì)器所必需的,。 // InitializeComponent(); base.OnInit(e); } /// <summary> /// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改 /// 此方法的內(nèi)容。 /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion } }
|