说到验证码,以前看到手机上面要用到验证码的时候,为什么有那么多干扰线,怎么生成的,现在老师上课讲了之后知道了。
首先,想要验证码的图片,我们肯定要创建图片才能有
//新增图片 byte[]:数组 二进制
Bitmap newBitmap = new Bitmap(strRandom.Length * 20, 38);
然后创建了图片,里面的线条肯定要用一支笔来画才行,
//绘画纸张的笔
Graphics g = Graphics.FromImage(newBitmap);
图片跟笔有了,然后图片背景要绘画成白色的背景图,而这个纸默认为空白
//默认为空的纸,绘画成白色背景的图
g.Clear(Color.White);
背景画完了,然后就到字体颜色了,字体颜色可以自己设置,不一定指定是为红色的字体颜色
//在图片上绘制文字 红色的文字颜色 Color.Red
SolidBrush solidBrush = new SolidBrush(Color.Red);
字体颜色设置好了,就设置一下字体类型,就是用什么字体,还有字体要多大,都可以自己设置,然后固定一下位置,把X坐标,Y坐标写上,固定在图片里面的范围
//什么字体,多大("Aril", 18);x坐标,y坐标(12, 4)
g.DrawString(strRandom, new Font("Aril", 18), solidBrush, 12, 4);
其实我们看到的验证码上面通常都会有干扰线,但是这干扰线不是用来干扰用户的,而是用来干扰机器的,干扰线主要是用于干扰机器登录
//在图片上绘制干扰线 干扰机器登录,防止机器登录
Random random = new Random();
循环一下图片大小,然后在图片大小的范围内随机产生线条,并且把线条绘制到画布上面,但在画完线的时候定义一下线的起点;画完线就要画一下图片的前景干扰的点,用以干扰机器,然后随机产生一个颜色,使图片不那么容易被看清楚里面的内容
for (int i = 0; i < 10; i++)
{
//随机 产生一条线,并绘制到画布。 起始点(x,y) 总结点
int x1 = random.Next(newBitmap.Width);
int y1 = random.Next(newBitmap.Height);
int x2 = random.Next(newBitmap.Width);
int y2 = random.Next(newBitmap.Height);
//画线
g.DrawLine(new Pen(Color.DarkGray), x1, y1, x2, y2);
}
//绘制图片的前景干扰的点
for (int i = 0; i < 100; i++)
{
int x = random.Next(newBitmap.Width);
int y = random.Next(newBitmap.Height);
//通过随机数再随机产生一个颜色
newBitmap.SetPixel(x, y, Color.FromArgb(random.Next()));
}
然后就要在图片最外边画一个边框,这个边框包裹着图片以及图片里面的内容,指定一下边框的类型为矩形
//在最外边绘制边框,包裹住画图 指定矩形
g.DrawRectangle(new Pen(Color.Blue), 0, 0, newBitmap.Width, newBitmap.Height);
g.DrawRectangle(new Pen(Color.Blue), -1, -1, newBitmap.Width, newBitmap.Height);
最后一步是讲图片保存到内存流中去,并且返回
//将图转保存到内存流中
MemoryStream ms = new MemoryStream();
newBitmap.Save(ms, ImageFormat.Jpeg);
//将流内容写入byte数组返回
return ms.ToArray();
全部制作完了之后的效果图:
简单点说就是画一幅画,画里面就是数字跟字母组成的,再多一点就是有干扰线,这画画肯定得有画笔,然后就得有画板,然后肯定得有图纸,有了图纸就还要有颜料,把字涂上颜色,不然图纸是白色的,然后文字也是白色的,那些出来的文字都看不见,写了等于没写,颜料有了,还得有些辅助工具,这些辅助工具有的是辅助字体的就是改变字体样式的,就是如果想把字体改变成楷书,隶书或者宋体等这些字体;还有的就是辅助图片生成干扰线的那些固定线条产生的位置的;最后得保存,就得有内存流帮忙。
这个在控制器的写法就比较简短了,这个是生成验证码图片的代码
public ActionResult CreateValidCodeImage()
{
//1、生成长度为5的随机的验证码字符串
string strRandom= ValidCodeUtils.GetRandomCode(5);
//2、根据生成的验证码字符串生成 验证码图片
byte[] imgByte = ValidCodeUtils.CreateImage(strRandom);
//3、将验证码字符串存入session中 key值为
Session["validCode"] = strRandom;
//4、把图片返回到视图
return File(imgByte, @"image/jpeg");
}
这些都是跟着老师的代码照着敲的,慢慢理解,然后明白就差不多了。