C#小程序—隨機產生驗證碼

最近在家閒來無事,看了幾天的書,頭有點大。手癢寫寫代碼。

1.目的

隨機產生驗證碼。用C#GDI+繪圖完成,由於我現在只會簡單的winform程序,完成後在winform上顯示。

                                               

2.思路

隨機在一定的字符中挑選幾個,然後將每個字符的各個屬性(字體,大小,顏色)隨機生成,接着畫出來就可以了。

3.實現

3.1定義變量

這裏的產生的字符數目和字體及顏色都可以自己添加。小建議:驗證碼所含的字符最好不要有歧義的,例如數字1和字母l。

char[] data = new char[6];  //用來裝產生的隨機字符,大小可變
        //字符顏色、字體等變化範圍
string[] myFont = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact", "微軟雅黑", "宋體" };
Color[] myColor = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
char[] myChar = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
                               'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y','Z','a','b','c','d','e',
                           'f','g','h','j','k','m','n','p','r','s','t','w','x','y','z'};

3.2定義畫布和bitmap等變量

背景爲白色。從myBitmap創建畫布。

Graphics g = this.CreateGraphics();
Bitmap myBitmap=new Bitmap(200,100);
g = Graphics.FromImage(myBitmap);
g.Clear(Color.White);

接下來是定義隨機變量Random。

Random r = new Random(DateTime.Now.Second);
下面利用r產生的隨機數是否一樣並不重要,驗證碼中的字符可以相同。

3.3畫

驗證碼還含有一些其他的線和點,來混淆視線。

	    
            //畫燥線
            for (int i = 0; i < 10; i++)
            {
                int x1 = r.Next(200);
                int y1 = r.Next(100);
                int x2 = r.Next(200);
                int y2 = r.Next(100);
                Color clr = myColor[r.Next(myColor.Length)];
                g.DrawLine(new Pen(clr), new Point(x1, y1), new Point(x2, y2));
            }

            //畫字符
            for (int i = 0; i < data.Length; i++)
                data[i] = (char)myChar[r.Next(myChar.Length)];
            for (int i = 0; i < data.Length; i++)
            {
                Font tempFont = new Font(myFont[r.Next(myFont.Length)], 18);
                g.DrawString(data[i].ToString(), tempFont,
                    new SolidBrush(myColor[r.Next(myColor.Length)]), (float)i * 20 + 40, (float)40);
            }
 
            //畫燥點
            for (int i = 0; i < 100; i++)
            {
                int x = r.Next(myBitmap.Width);
                int y = r.Next(myBitmap.Height);
                Color tempColor = myColor[r.Next(myColor.Length)];
                myBitmap.SetPixel(x, y, tempColor);
            };

3.4顯示和保存

畫完成了,但這是並沒有顯示出來,這時只畫在myBitmap中,爲了將他顯示出來,定義另一個畫布。

Graphics thisGr;
thisGr = this.CreateGraphics();
thisGr.DrawImage(myBitmap, new Point(90, 35));

這就完成了。

                                 

在退出前,不要忘記釋放資源。

4.不足

產生的驗證碼不美觀,且驗證碼中的字符沒有傾斜的效果。

5.代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;

namespace Ch53_隨機產生驗證碼
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            thisGr = this.CreateGraphics();
        }

        char[] data = new char[6];  //用來裝產生的隨機字符,大小可變
        //字符顏色、字體等變化範圍
        string[] myFont = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact", "微軟雅黑", "宋體" };
        Color[] myColor = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
        char[] myChar = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J',
                               'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y','Z','a','b','c','d','e',
                           'f','g','h','j','k','m','n','p','r','s','t','w','x','y','z'};
        Graphics thisGr;

        private void btnSet_Click(object sender, EventArgs e)
        {
            Graphics g = this.CreateGraphics();
            Bitmap myBitmap=new Bitmap(200,100);
            g = Graphics.FromImage(myBitmap);
            g.Clear(Color.White);
            Random r = new Random(DateTime.Now.Second);

            //畫燥線
            for (int i = 0; i < 10; i++)
            {
                int x1 = r.Next(200);
                int y1 = r.Next(100);
                int x2 = r.Next(200);
                int y2 = r.Next(100);
                Color clr = myColor[r.Next(myColor.Length)];
                g.DrawLine(new Pen(clr), new Point(x1, y1), new Point(x2, y2));
            }

            //畫字符
            for (int i = 0; i < data.Length; i++)
                data[i] = (char)myChar[r.Next(myChar.Length)];
            for (int i = 0; i < data.Length; i++)
            {
                Font tempFont = new Font(myFont[r.Next(myFont.Length)], 18);
                g.DrawString(data[i].ToString(), tempFont,
                    new SolidBrush(myColor[r.Next(myColor.Length)]), (float)i * 20 + 40, (float)40);
            }
 
            //畫燥點
            for (int i = 0; i < 100; i++)
            {
                int x = r.Next(myBitmap.Width);
                int y = r.Next(myBitmap.Height);
                Color tempColor = myColor[r.Next(myColor.Length)];
                myBitmap.SetPixel(x, y, tempColor);
            }

            myBitmap.Save("c:\\photo.gif");
            thisGr.DrawImage(myBitmap, new Point(90, 35));
            myBitmap.Dispose();
            g.Dispose();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            thisGr.Dispose();
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章