验证码帮助类【CaptchaHelper 】

GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,

图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.

大概了解了什么是GDI+后,我们来看一下绘图要用到的主要工具,要画图,

1.要画纸(Map),

2.画画板可以通过Graphics这个类来创建,有了画板,

3.总得弄个笔(Pen)什么之类的吧,不然怎么画呀,难不成我们用手指画.笔又可以分好多种类,比如铅笔,画刷等.它们的区别主要是铅笔可以用来画线条,而画刷呢,嘿嘿,自己考虑下.在c#中我们可以用Pen,Brush类来实现类似功能.

4.颜料则自然是用Color类了.

 1 /// 
 2     /// 完美随机验证码
 3     /// 随机生成设定验证码,并随机旋转一定角度,字体颜色不同
 4     /// 
 5     public static class CaptchaHelper
 6     {
 7         /// 
 8         /// 生成随机码
 9         /// 
10         /// 随机码个数
11         /// 
12         public static string CreateRandonCode(int length) 
13         {
14             return Guid.NewGuid().ToString("N").Substring(0, length);
15         }
16 
17         /// 
18         /// 创建随机码图片
19         /// 
20         /// 验证码
21         /// 字体大小
22         /// 背景颜色
23         /// 边框颜色
24         /// GIF图片二进制流
25         public static byte[] DrawImage(string vcode, float fontSize = 14, Color background = default(Color), Color border = default(Color)) 
26         {
27             //随机旋转角度 基数
28             const int RandAngle = 45;
29 
30             var width = vcode.Length * (int)fontSize;
31 
32             //创建图片背景
33             using (var map = new Bitmap(width + 3, (int)fontSize + 10)) 
34             {
35                 using (var graphics = Graphics.FromImage(map)) 
36                 {
37                     graphics.Clear(background);//清除画面,填充背景
38                     graphics.DrawRectangle(new Pen(border, 0), 0, 0, map.Width-1, map.Height-1);//画一个边框
39 
40                     var random = new Random();
41 
42                     //背景噪点生成
43                     var blackPen = new Pen(Color.DarkGray, 0);
44 
45                     for (var i = 0; i < 50; i++) 
46                     {
47                         int x = random.Next(0, map.Width);
48                         int y = random.Next(0, map.Height);
49 
50                         graphics.DrawRectangle(blackPen, x, y, 1, 1);
51                     }
52 
53                     //验证码旋转,防止机器识别
54                     var chars = vcode.ToCharArray();//拆散字符串成单字符数组
55 
56                     //文字居中
57                     var format = new StringFormat(StringFormatFlags.NoClip)
58                     {
59                         Alignment = StringAlignment.Center,
60                         LineAlignment = StringAlignment.Center
61                     };
62 
63                     //定义颜色
64                     Color[] colors = { Color.Black, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.DarkGoldenrod };
65                     FontStyle[] styles = { FontStyle.Bold, FontStyle.Italic, FontStyle.Regular, FontStyle.Underline };
66 
67                     //定义字体
68                     string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
69                     foreach (char item in chars) 
70                     {
71                         int cindex = random.Next(8);
72                         int findex = random.Next(5);
73                         int sindex = random.Next(4);
74 
75                         var font = new Font(fonts[findex], fontSize, styles[sindex]);//字体样式(参数2为字体大小)
76                         Brush b = new SolidBrush(colors[cindex]);
77                         var dot = new Point(16, 16);
78 
79                         float angle = random.Next(-RandAngle, RandAngle);//转动的度数
80 
81                         graphics.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
82                         graphics.RotateTransform(angle);
83                         graphics.DrawString(item.ToString(CultureInfo.InvariantCulture), font, b, 1, 1, format);
84 
85                         graphics.RotateTransform(-angle);//转回去
86                         graphics.TranslateTransform(2, -dot.Y);//移动光标到指定位置
87 
88                     }
89                 }
90                 //生成图片
91                 var stream = new MemoryStream();
92                 map.Save(stream, ImageFormat.Gif);
93                 //输出图片流
94                 return stream.ToArray();
95             }
96         }
97     }

 

转载于:https://www.cnblogs.com/WarBlog/p/8484119.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部