生成验证码
- 1、学习路线
- 2、一个简单的GDI小案例
.NET生成图片 GDI 代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 using System.IO; 7 using System.Drawing.Imaging; 8 9 namespace ConsoleApplication1 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 //这段代码开始前,要添加System.Drawing的引用。 16 //创建一个尺寸为500*500的内存图片 17 using (Bitmap bmp = new Bitmap(500, 500)) 18 //得到图片的画布 19 using (Graphics g = Graphics.FromImage(bmp)) 20 { 21 //创建画笔 22 using (Font font = new Font(FontFamily.GenericSerif, 30)) 23 { 24 //在100,100处画一个红色的helloWorld 25 g.DrawString("HelloWorld", font, Brushes.Red, 100, 100); 26 //在100,100处画一个蓝色的椭圆 27 g.DrawEllipse(Pens.Blue, 100, 100, 100, 100); 28 29 using (Stream stream = File.OpenWrite(@"d:\2.jpg")) 30 { 31 bmp.Save(stream, ImageFormat.Jpeg); 32 } 33 } 34 } 35 } 36 } 37 }
以上控制台应用程序运行之后便可在D盘下找到图片2.jpg
- 3.如何在网页中动态生成一个图片
从代码的角度上看。跟上边控制台上的代码仅有几点简单区别,几乎一样!
1)一般处理程序需要先设置ContentType =“image/jpeg”
2)一般处理程序需要把图片保存到Response.OutputStream中
代码: -
1 context.Response.ContentType = "image/jpeg"; 2 3 //这段代码开始前,要添加System.Drawing的引用。 4 //创建一个尺寸为500*500的内存图片 5 using (Bitmap bmp = new Bitmap(500, 500)) 6 //得到图片的画布 7 using (Graphics g = Graphics.FromImage(bmp)) 8 { 9 //创建画笔 10 using (Font font = new Font(FontFamily.GenericSerif, 30)) 11 { 12 //在100,100处画一个红色的helloWorld 13 g.DrawString("HelloWorld", font, Brushes.Red, 100, 100); 14 //在100,100处画一个蓝色的椭圆 15 g.DrawEllipse(Pens.Blue, 100, 100, 100, 100); 16 //图片保存到输出流 17 bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg); 18 19 } 20 }
-
4.简单的数字验证码
既然我们已经解决了如何动态生成图片,和如何在一般处理程序中返回一个图片的问题。
那么做验证码的技术问题,只剩下了如何生成四位随机数了。
其实就是用Random生成 1000~9999之间的随机数。
然后把这个四位数放到Session中,在根据这个数字生成验证码图片。
这就是生成验证码的基础逻辑了。
1 public void ProcessRequest(HttpContext context) 2 { 3 context.Response.ContentType = "image/jpeg"; 4 5 Random random = new Random(); 6 //生成随机数 7 string code = random.Next(1000, 9999).ToString(); 8 //把验证码放到Session中,方便以后比对 9 context.Session["checkCode"] = code; 10 //开始生成验证码的图片 11 using (Bitmap bmp = new Bitmap(130, 50)) 12 using (Graphics g = Graphics.FromImage(bmp)) 13 { 14 using (Font font = new Font(FontFamily.GenericSerif, 30)) 15 { 16 g.DrawString(code, font, Brushes.AliceBlue, 10, 10); 17 //图片保存到输出流 18 bmp.Save(context.Response.OutputStream, ImageFormat.Jpeg); 19 } 20 } 21 }
生成效果(当然这样的验证码,稍微懂一点图形学的人都能用程序读取出来,开发中千万别这么干!)
补充说明 - 稍微复杂一点的验证码
上面的验证码太简陋了,现在说一个稍微复杂一点的。
我的改进思路是这样的。
1)既然随机生成数字太简单,觉得说不过去。那就随机生成5个字符。
字符写在一个数组里。随机生成数组下标,然后拿出五个。字符数组我们可以写的复杂一点。
2)生成图片以后,在图片上随手扔点躁点,增加其他程序的识别成本。
1 public void ProcessRequest(HttpContext context) 2 { 3 string checkCode = GenCode(5); // 产生5位随机字符 4 context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证 5 System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22); 6 Graphics g = Graphics.FromImage(image); 7 try 8 { 9 //生成随机生成器 10 Random random = new Random(); 11 //清空图片背景色 12 g.Clear(Color.White); 13 // 画图片的背景噪音线 14 int i; 15 for (i = 0; i < 25; i++) 16 { 17 int x1 = random.Next(image.Width); 18 int x2 = random.Next(image.Width); 19 int y1 = random.Next(image.Height); 20 int y2 = random.Next(image.Height); 21 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); 22 } 23 24 Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold)); 25 System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true); 26 g.DrawString(checkCode, font, brush, 2, 2); 27 //画图片的前景噪音点 28 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); 29 System.IO.MemoryStream ms = new System.IO.MemoryStream(); 30 image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 31 context.Response.ClearContent(); 32 context.Response.ContentType = "image/Gif"; 33 context.Response.BinaryWrite(ms.ToArray()); 34 } 35 finally 36 { 37 g.Dispose(); 38 image.Dispose(); 39 } 40 } 41 42 /// <summary> 43 /// 产生随机字符串 44 /// </summary> 45 /// <param name="num">随机出几个字符</param> 46 /// <returns>随机出的字符串</returns> 47 private string GenCode(int num) 48 { 49 string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 50 char[] chastr = str.ToCharArray(); 51 // string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" }; 52 string code = ""; 53 Random rd = new Random(); 54 int i; 55 for (i = 0; i < num; i++) 56 { 57 //code += source[rd.Next(0, source.Length)]; 58 code += str.Substring(rd.Next(0, str.Length), 1); 59 } 60 return code; 61 }
生成效果图
本文乃参考大黑兔博主的,非本人自己编写,仅供参考