通過這個小程序我們來熟悉一下簡單的GDI繪製和理解一下常見的驗證碼繪製原理,歡迎大家批評指正。大概的思路就是在一個bitmap對象上隨機產生一個由不同字體不同顏色不同字符組成的的驗證碼,然後在繪製一些干擾的線條和點。我們先看一下程序的運行效果,如圖:
具體實現步驟如下:
打開visual studio 新建一個winform應用程序,在設計器中添加三個控件picturebox button textbox
- PictureBox 用來顯示驗證碼的,並添加click事件,鼠標每點擊一下更換一個驗證碼
- button 用來驗證文本框中輸入的驗證碼是否正確
- Textbox 用來輸入驗證碼
在picturebox的click事件中生成驗證碼
繪製驗證碼
- 先創建一個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)]);
}
下面是代碼的截圖:
最後是完整的代碼:
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();
}
}
閱讀更多 路馬編程 的文章