先上效果图:
需求:6位随机字符串,包括数字、大小写字母,颜色随机;随机干扰线条和噪点;点击图片更换验证码;判断验证码输入是否正确;区分字母大小写(感兴趣的可以加上不区分大小写的功能)。
验证码是一张图片,放置在pictureBox容器中,我们要将验证码绘制在位图(Bitmap)中,然后将该位图放入pictureBox中。创建一个位图对象作为画布:
Bitmap bitmap = new Bitmap(351, 183);
再用bitmap创建GDI+对象:
Graphics g = Graphics.FromImage(bitmap);
创建一个产生随机数的对象:
Random r = new Random();
我们需要申明下验证码包含的字符及字符颜色:
//验证码包含的字符
string allCode =
"0123456789" +
"bcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Color[] colors =
{ Color.Red,
Color.Black,
Color.Blue,
Color.Green,
Color.Pink,
Color.Purple };
下面就是绘制验证码,我们通过遍历的方式逐个绘制验证码(本例采用6位验证码):
//遍历绘制单个字符
for (int i = 0; i < 6; i++)
{
//字体大小在(15, 24)之间
Font font = new Font(
fonts[r.Next(0, fonts.Length)],
50f + r.Next(-5, 5),
FontStyle.Bold);
SolidBrush brush = new SolidBrush(
colors[r.Next(0, colors.Length)]);
g.DrawString(code[i].ToString(), font, brush, i * 40, 20);
}
这里调用了DrawString()方法来绘制,其中四个参数分别为:
·要绘制的字符
·字符的字体
·字符的颜色
·字符的坐标点(字体左上角的坐标)
验证码绘制完,我们加一些干扰线条和噪点:
//绘制线条
for (int i = 0; i < 30; i++)
{
g.DrawLine(
Pens.Green,
r.Next(0, bitmap.Width),
r.Next(0, bitmap.Height),
r.Next(0, bitmap.Width),
r.Next(0, bitmap.Height));
}
//绘制噪点(不用GDI+绘制)
for (int i = 0; i < 300; i++)
{
bitmap.SetPixel(
r.Next(0, bitmap.Width),
r.Next(0, bitmap.Height),
colors[r.Next(0, colors.Length)]);
}
欢迎关注公众号【几行简码】(ID:few_codes)免费下载源码,刚开始做,希望大家支持。