asp.net 產生驗證碼源碼

來源:互聯網
上載者:User
 代碼如下 複製代碼

<%@ 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();
    }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.