<%@ WebHandler Language="C#" Class="verifyCode" %> using System; using System.Web; using System.Web.SessionState;//第一步匯入命名空間 using System.Drawing; public class verifyCode : IHttpHandler, IRequiresSessionState {//第二步實現介面 就和平常一樣可以使用session public void ProcessRequest(HttpContext context) { string checkCode = this.CreateRandomCode(4).ToLower(); context.Session["checkCode"] = checkCode; this.CreateImage(context, checkCode); } public bool IsReusable { get { return false; } } /// <summary> /// 按位產生隨機 /// </summary> /// <param name="codeCount"></param> /// <returns></returns> private string CreateRandomCode(int codeCount) { int number; string checkCode = String.Empty; Random random = new Random(); for (int i = 0; i < codeCount; i++) { number = random.Next(100); switch (number % 3) { case 0: checkCode += ((char)('0' + (char)(number % 10))).ToString(); break; case 1: checkCode += ((char)('a' + (char)(number % 26))).ToString(); break; case 2: checkCode += ((char)('A' + (char)(number % 26))).ToString(); break; default: break; } } return checkCode; } /// <summary> /// 根據字元產生圖片 /// </summary> /// <param name="context"></param> /// <param name="checkCode"></param> private void CreateImage(HttpContext context,string checkCode) { int randAngle = 45;//隨機轉動角度 int iwidth = (int)(checkCode.Length * 23); //封裝GDI+ 位元影像,此位元影像由圖形映像及其屬性的像素資料群組成,指定的寬度和高度。以像素為單位 System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 28); //封裝一個 GDI+繪圖圖面。無法繼承此類。從指定的Image建立新的 Graphics Graphics g = Graphics.FromImage(image); //清除整個繪圖面並以指定背景填充 g.Clear(Color.AliceBlue); //畫一個邊框 g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1); //定義繪製直線和曲線的對象。(只是Pen的顏色,指示此Pen的寬度的值) Pen blackPen = new Pen(Color.LightGray, 0); Random rand = new Random(); //劃橫線的條數 可以根據自己的要求 for (int i = 0; i < 50; i++) { //隨機高度 //int y = rand.Next(image.Height); /*繪製一條連線由座標組指定的兩個點的線條 線條顏色、寬度和樣式,第一個點的x座標和y座標,第二個點的x座標和y座標*/ //g.DrawLine(blackPen, 0, y, image.Width, y); int x = rand.Next(0, image.Width); int y = rand.Next(0, image.Height); //畫矩形,座標(x,y)寬高(1,1) g.DrawRectangle(blackPen, x, y, 1, 1); } //拆散字串成單個字元數組 char[] chars = checkCode.ToCharArray(); //文字置中 StringFormat format = new StringFormat(StringFormatFlags.NoClip); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; //定義顏色 Color[] c = { Color.Black, Color.DarkGray, Color.DarkOrange, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //定義字型 string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體", "Arial Baltic" }; for (int i = 0; i < chars.Length; i++) { int cindex = rand.Next(c.Length); int findex = rand.Next(font.Length); //font 封裝在特定裝置上呈現特定字型所需的紋理和資源(字型,大小,字型樣式) Font f = new System.Drawing.Font(font[findex], 16, System.Drawing.FontStyle.Bold); /*Brush定義用於填充圖形映像(如矩形、橢圓、圓形、多邊形和封閉路徑)的內部對象 SolidBrush(Color.White)初始化指定的顏色 指定畫筆顏色為白色*/ Brush b = new System.Drawing.SolidBrush(c[cindex]); Point dot = new Point(16, 16); //轉動的度數 float angle = rand.Next(-randAngle, randAngle); //移動游標到指定位置 g.TranslateTransform(dot.X, dot.Y); g.RotateTransform(angle); /*在指定的位置並且用指定的Brush和Font對象繪製指定的文本字串 (指定的字串,字串的文字格式設定,繪製文本顏色和紋理,所繪製文本的左上方的x座標,座標)*/ g.DrawString(chars[i].ToString(), f, b, 1, 1, format); //轉回去 g.RotateTransform(-angle); //移動游標指定位置 g.TranslateTransform(2, -dot.Y); } //建立儲存區為記憶體流 System.IO.MemoryStream ms = new System.IO.MemoryStream(); //將此映像以指定的格式儲存到指定的流中(將其儲存在記憶體流中,映像的格式) image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //清除緩衝區將流中的內容輸出 context.Response.ClearContent(); //擷取輸出資料流的類型 context.Response.ContentType = "image/Jpeg"; //將二進位字串寫入HTTP輸出資料流 context.Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } } |