验证码帮助类【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 /// <summary>
 2     /// 完美随机验证码
 3     /// 随机生成设定验证码,并随机旋转一定角度,字体颜色不同
 4     /// </summary>
 5     public static class CaptchaHelper
 6     {
 7         /// <summary>
 8         /// 生成随机码
 9         /// </summary>
10         /// <param name="length">随机码个数</param>
11         /// <returns></returns>
12         public static string CreateRandonCode(int length) 
13         {
14             return Guid.NewGuid().ToString("N").Substring(0, length);
15         }
16 
17         /// <summary>
18         /// 创建随机码图片
19         /// </summary>
20         /// <param name="vcode">验证码</param>
21         /// <param name="fontSize">字体大小</param>
22         /// <param name="background">背景颜色</param>
23         /// <param name="border">边框颜色</param>
24         /// <returns>GIF图片二进制流</returns>
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