通过这个小程序我们来熟悉一下简单的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();
}
}
閱讀更多 路馬編程 的文章