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();

}

}


分享到:


相關文章: