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 }