C#基礎回顧:用GDI+繪製驗證碼

來源:互聯網
上載者:User

      驗證碼在很多需要使用者登陸或發表言論的網頁上都可以見到。傳統的一般是用代表各種不同數字或字元的圖片來進行組合,從而實現效果。但是,很明顯這種方式的靈活性不高,而且需要準備大量的圖片作素材。

      目前,一般就是採用全自動產生,整個驗證碼為一張圖片,而不是多張圖片的組合。在.Net中,可以通過GDI+來實現,可能你會覺得很麻煩,但只要跟著我操作一遍,你就會發現其實很簡單。
      現在,就開始製作一個最簡單的驗證碼。 (這裡並不介紹如何使用GDI+技術,相關內容請大家查看這裡)
      1.既然要產生驗證碼,那是關鍵的莫過於產生隨機數(這裡的隨機數,指的是數字與字母的組合)。
      大家想一下數字和字元是不是都有是用ASCII碼進行編碼進行表示?因此,想要產生含字母和數位隨機數,不僅僅只有通過事先提供所有數字和字母這種方法,還可以有很多種辦法。大家如果什麼好的辦法,希望不吝賜教。我今天要介紹的是一種很簡單的辦法。直接來看代碼吧:

產生隨機數
public static string Generate(RandomGeneratorStyle style, int length)
{
    string strValidateString="";
    Random rnd = new Random();
    string strValidateStringSource;
    switch (style)
    {
        case RandomGeneratorStyle.Number: 
            strValidateStringSource = "0123456789"; 
            break;
        case RandomGeneratorStyle.NumberAndChar: 
            strValidateStringSource = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            break;
        case RandomGeneratorStyle.NumberAndCharIgnoreCase:
            strValidateStringSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            break;
        default:
            strValidateStringSource = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            break;
    }
    for (int i = 0; i < length; i++)
    {
        strValidateString += strValidateStringSource[rnd.Next(strValidateStringSource.Length - 1)];
    }
    return strValidateString;
}

      上面有一個RandomGeneratorStyle,這個是我自己寫的一個枚舉,用於表示需要產生哪種驗證碼。

RandomGeneratorStyle
public enum RandomGeneratorStyle
{
    /// <summary>
    /// 只有數字
    /// </summary>
    Number,
    /// <summary>
    /// 包含數字和大小寫字元
    /// </summary>
    NumberAndChar,
    /// <summary>
    /// 包含數字和大寫字元
    /// </summary>
    NumberAndCharIgnoreCase
}

      2.有了這些數,那下面就基本上考你是畫畫的功夫了。當然這裡用到的不是顏料、水彩筆等,而是要用GDI+。
      平時,我們看見的驗證碼是什麼樣式子的?是不是一個矩形?矩形裡面有一些隨機數?那接下去要做的就是用GDI+技術把產生的隨機數畫到一個矩形中。
      這個要用到的主要的就只有一個方法:Graphics.DrawString();不瞭解的朋友可以先去網上查查關於這個方法的介紹。下面直接來看代碼:

繪製驗證碼
public static void Generate(RandomGeneratorStyle style, int length,Page curPage)
{
    Bitmap bmp = new Bitmap((int)Math.Ceiling(length * 12.5), 20);//建立一個圖片對象
    Graphics g = Graphics.FromImage(bmp);//利用該圖片對象產生“畫板”
    string strCode = RandomGenerator.Generate(style, length);//產生隨機數
    curPage.Session["yzmCode"] = strCode;//儲存到Session中,為驗證服務.你也可以存放在其它地方,只要在需要驗證的時候你能取到
    Font font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Italic);//設定字型顏色
    SolidBrush brush = new SolidBrush(Color.White);//建立一個畫刷,到這裡為止,我們已經準備好了畫板、畫刷、和資料
    g.DrawString(strCode, font, brush, 0, 0);//關鍵的一步,進行繪製。
    bmp.Save(curPage.Response.OutputStream, ImageFormat.Jpeg);//儲存為輸出資料流,否則頁面上顯示不出來
    g.Dispose();//釋放掉該資源
}

      現在,就可以來測試下它的效果了。想要調用上面的方法,我們必須要傳入一個當前的Page對象,為此我們可以建立一個頁面命名為yzm.aspx。然後,在PageLoad中調用該方法。這樣,我們便可以看到它了。如1所示:

     
圖1 驗證碼

      如果,你需要在img元素中顯示,那也很簡單,只需要把src設定為yzm.aspx就可以了。<img src="yzm.aspx" alt="" />
      最後,再來介紹下如何進行驗證。(如果只顯示,不驗證,那就不能管它叫驗證碼了。)
      細心的朋友應該已經發現,在繪製驗證碼的方法中,我設定了一個Session。那要進行驗證的話,自然是通過與這個繪製時所設定的Session比較了。代碼如下:

驗證方法
public static bool Validate(string codeToBeValidate,Page curPage)
{
    if (curPage.Session["yzmCode"] != null)
    {
        return curPage.Session["yzmCode"].ToString() == codeToBeValidate;
    }
    else
        return false;
}

      通過上面的這種方式,就可以產生驗證碼了。如果你想要產生漂亮些的驗證碼,那就需要你自己在繪製過程中再動動腦筋了。

作者:stg609
出處:http://stg609.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.