C# 繪圖 圖片Bitmap應用 驗證圖(二)

前面繪圖的應用上手後,接下來是比較有趣跟實作:
產生網路帳號注冊驗證時,常常會出現的亂數認證圖片



說明:
本例操作後,會隨機產生如上面的圖
預期結果:
一、排除易混淆字體 數字:0 1 ,英文:I O l o
二、字的顏色與圖的顏色互斥,避免看不清楚
三、產生亂數雜點

由於此隨機產生的圖能給多個專案使用
所以會另外寫一個類別庫 (*.dll)
要使用時,記得先加入參考!



步驟:
一、新增專案,設定「類別庫」,命名Vaild
二、撰寫隨機產生的引擎,寫好記得建置
三、另開啟專案,引入參考
四、撰寫程式使用該引擎

程式碼:
隨機引擎:

public class VaildNum
{
    private Bitmap vaildNumImage;
    public Bitmap VaildNumImage { get { return this.vaildNumImage; } }
    //傳亂數產生後的圖

    private String vaildNumAnswer;
    public String VaildNumAnswer { get { return this.vaildNumAnswer; } }
    //傳亂數產生的字

    private Random rr;
    private char[] texts;
    private int numCount;

    public VaildNum(int num=6)
    {
        //(int num=6),意思是若呼叫這個建構子,不給參數預設為6
        this.numCount = num;
        rr = new Random();
        vaildNumAnswer = "";           

        List LL = new List();
        //用來存放篩選後的字
            
        for (int i = 50; i <= 57; i++)
            //ASCII碼,找出數字
            LL.Add((char)i); //從2開始,排除了0,1,放入列表

           
        for (int i = 65; i <=90; i++)
        {
            //ASCII碼,找出大寫英文
            if (i == 73) continue; //排除I
            if (i == 79) continue; //排除O
            LL.Add((char)i);
        }

            
        for (int i = 97; i <= 122; i++)
        {
            //參考ASCII碼,找出小寫英文
            if (i == 108) continue; //排除l
            if (i == 111) continue; //排除o
            LL.Add((char)i);
        }

        texts = new char[LL.Count];
        texts = LL.ToArray();


        //亂數產生驗證答案
        vaildNumAnswer = "";
        for (int i = 1; i <= this.numCount; i++)
        {
            char c = texts[rr.Next(texts.Length)];
            vaildNumAnswer += c;
        }

        //產生驗證圖片
        RenderImage();
    }

    //產生驗證圖片
    private void RenderImage()
    {
        int ww=30 * 2 + this.numCount * 20;
        //寬度=(留邊)30*2 + 每個字*20
        int hh=70;

        vaildNumImage = new Bitmap(ww, hh);
        Graphics gg = Graphics.FromImage(vaildNumImage);

        //產生背景色
        Color cc = Color.FromArgb(rr.Next(256), rr.Next(256), rr.Next(256));
        Brush bb = new SolidBrush(cc);
        gg.FillRectangle(bb, 0, 0, ww, hh);

        //產生字色,斥掉背景色
        bb = new SolidBrush(Color.FromArgb(cc.R ^ 255, cc.G ^ 255, cc.B ^ 255));
        //產生字體
        Font ff = new Font("Arial Black", 18, FontStyle.Regular);
        //逐一畫每一個字
        for (int i = 0; i < this.vaildNumAnswer.Length; i++)
        {
            gg.DrawString(
                this.vaildNumAnswer.Substring(i, 1),
                ff, bb, i * 20 + 30, 20);
        }

        //加入雜點
        bb = new SolidBrush(Color.White);
        for (int i = 1; i <= 500; i++)
            gg.FillRectangle(bb, rr.Next(ww), rr.Next(hh), 2, 2);
            
    }
        

}


在專案中呼叫:

private void button8_Click(object sender, EventArgs e)
{
    Vaild.VaildNum vn = new Vaild.VaildNum(10);            
    Bitmap mm=vn.VaildNumImage; //取得對應的圖
    gg.DrawImage(mm, 50, 50);

    MessageBox.Show(vn.VaildNumAnswer); //取得對應的答案並秀出
}

留言

熱門文章