C#做一個常見的驗證碼的小程序

通過這個小程序我們來熟悉一下簡單的GDI繪製和理解一下常見的驗證碼繪製原理,歡迎大家批評指正。大概的思路就是在一個bitmap對象上隨機產生一個由不同字體不同顏色不同字符組成的的驗證碼,然後在繪製一些干擾的線條和點。我們先看一下程序的運行效果,如圖:

C#做一個常見的驗證碼的小程序
C#做一個常見的驗證碼的小程序

具體實現步驟如下:

打開visual studio 新建一個winform應用程序,在設計器中添加三個控件picturebox button textbox

  1. PictureBox 用來顯示驗證碼的,並添加click事件,鼠標每點擊一下更換一個驗證碼
  2. button 用來驗證文本框中輸入的驗證碼是否正確
  3. Textbox 用來輸入驗證碼

在picturebox的click事件中生成驗證碼

繪製驗證碼

  1. 先創建一個bitmap對象和一個GDI對象

int bmpWidth = 300, bmpHeight = 60;

Bitmap bmp = new Bitmap(bmpWidth, bmpHeight);

Point pt = new Point(0, 20);

Graphics gp = Graphics.FromImage(bmp);//創建GDI對象

2.將bitmap對象賦值給picturebox的image

3.定義三個數組

font數組用來保存幾個字體,可根據當前計算機的字體安裝情況來自定義

color數組用來保存幾種顏色

char數組 我這裡是用來演示的,所以只選用了幾個漢字,實際開發當中可以隨意

string[] font = { "微軟雅黑", "仿宋", "幼圓", "隸書", "楷書" };

Color[] color = { Color.Red, Color.Blue, Color.Gray, Color.Honeydew, Color.HotPink,Color.Gainsboro,Color.Indigo, Color.Black, Color.Green, Color.Yellow };

char[] chs = {'我','是','大','哥','老','虎','想','李','牛','路','馬'};

4.接下來就是生成驗證碼

//生成一個由5個字符組成的驗證碼 實際開發中可以自定義

for (int i = 0; i < 5; i++)

{

char ch = chs[rnd.Next(0, chs.Length)];

code += ch.ToString();

//隨機生成驗證碼

gp.DrawString(code[i].ToString(), new Font(font[rnd.Next(0,5)],

25, FontStyle.Bold),new SolidBrush(color[rnd.Next(0,5)]), pt);

pt.X += 35;//每個字之間相隔像素點個數

}

5.繪製驗證碼的背景線條和點

//繪製背景線條

可以根據實際情況更改線條的數量

for (int i = 0; i < 50; i++)

{

Point pt1 = new Point(rnd.Next(0, bmpWidth),rnd.Next(0, bmpHeight));

Point pt2 = new Point(rnd.Next(0, bmpWidth), rnd.Next(0, bmpHeight));

gp.DrawLine(new Pen(Brushes.Green),pt1,pt2);

}

//繪製背景黑點

for (int i = 0; i < 2500; i++)

{

Point pt1 = new Point(rnd.Next(0, bmpWidth), rnd.Next(0, bmpHeight));

bmp.SetPixel(pt1.X, pt1.Y, color[rnd.Next(0, 5)]);

}

下面是代碼的截圖:

C#做一個常見的驗證碼的小程序

最後是完整的代碼:

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

pictureBox1.Click += pictureBox1_Click;

}

//用來保存驗證碼的一個屬性

public string VerificationCode

{

get;

set;

}

void pictureBox1_Click(object sender, EventArgs e)

{

int bmpWidth = 300, bmpHeight = 60;

Bitmap bmp = new Bitmap(bmpWidth, bmpHeight);

Point pt = new Point(0, 20);

Graphics gp = Graphics.FromImage(bmp);//創建GDI對象

Random rnd = new Random();

string code = null;

pictureBox1.Image = bmp;

string[] font = { "微軟雅黑", "仿宋", "幼圓", "隸書", "楷書" };

Color[] color = { Color.Red, Color.Blue, Color.Gray, Color.Honeydew,

Color.HotPink,Color.Gainsboro,Color.Indigo, Color.Black, Color.Green, Color.Yellow };

char[] chs = {'我','是','大','哥','老','虎','想','李','牛','路','馬'};

//生成一個由5個字符組成的驗證碼 實際開發中可以自定義

for (int i = 0; i < 5; i++)

{

char ch = chs[rnd.Next(0, chs.Length)];

code += ch.ToString();

//隨機生成驗證碼

gp.DrawString(code[i].ToString(), new Font(font[rnd.Next(0,5)],

25, FontStyle.Bold),new SolidBrush(color[rnd.Next(0,5)]), pt);

pt.X += 35;//每個字之間相隔像素點個數

}

VerificationCode = code;

//繪製背景線條

for (int i = 0; i < 50; i++)

{

Point pt1 = new Point(rnd.Next(0, bmpWidth),rnd.Next(0, bmpHeight));

Point pt2 = new Point(rnd.Next(0, bmpWidth), rnd.Next(0, bmpHeight));

gp.DrawLine(new Pen(Brushes.Green),pt1,pt2);

}

//繪製背景黑點

for (int i = 0; i < 2500; i++)

{

Point pt1 = new Point(rnd.Next(0, bmpWidth), rnd.Next(0, bmpHeight));

bmp.SetPixel(pt1.X, pt1.Y, color[rnd.Next(0, 5)]);

}

}

private void button1_Click(object sender, EventArgs e)

{

if (textBox1.Text.ToUpper() == VerificationCode)

{

MessageBox.Show("驗證碼正確");

}

else

{

MessageBox.Show("驗證碼錯誤,正確的驗證碼應該是: " + VerificationCode);

textBox1.Focus();

textBox1.SelectAll();

}

}


分享到:


相關文章: