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类了.

 /// <summary>
/// 完美随机验证码
/// 随机生成设定验证码,并随机旋转一定角度,字体颜色不同
/// </summary>
public static class CaptchaHelper
{
/// <summary>
/// 生成随机码
/// </summary>
/// <param name="length">随机码个数</param>
/// <returns></returns>
public static string CreateRandonCode(int length)
{
return Guid.NewGuid().ToString("N").Substring(, length);
} /// <summary>
/// 创建随机码图片
/// </summary>
/// <param name="vcode">验证码</param>
/// <param name="fontSize">字体大小</param>
/// <param name="background">背景颜色</param>
/// <param name="border">边框颜色</param>
/// <returns>GIF图片二进制流</returns>
public static byte[] DrawImage(string vcode, float fontSize = , Color background = default(Color), Color border = default(Color))
{
//随机旋转角度 基数
const int RandAngle = ; var width = vcode.Length * (int)fontSize; //创建图片背景
using (var map = new Bitmap(width + , (int)fontSize + ))
{
using (var graphics = Graphics.FromImage(map))
{
graphics.Clear(background);//清除画面,填充背景
graphics.DrawRectangle(new Pen(border, ), , , map.Width-, map.Height-);//画一个边框 var random = new Random(); //背景噪点生成
var blackPen = new Pen(Color.DarkGray, ); for (var i = ; i < ; i++)
{
int x = random.Next(, map.Width);
int y = random.Next(, map.Height); graphics.DrawRectangle(blackPen, x, y, , );
} //验证码旋转,防止机器识别
var chars = vcode.ToCharArray();//拆散字符串成单字符数组 //文字居中
var format = new StringFormat(StringFormatFlags.NoClip)
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
}; //定义颜色
Color[] colors = { Color.Black, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple, Color.DarkGoldenrod };
FontStyle[] styles = { FontStyle.Bold, FontStyle.Italic, FontStyle.Regular, FontStyle.Underline }; //定义字体
string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
foreach (char item in chars)
{
int cindex = random.Next();
int findex = random.Next();
int sindex = random.Next(); var font = new Font(fonts[findex], fontSize, styles[sindex]);//字体样式(参数2为字体大小)
Brush b = new SolidBrush(colors[cindex]);
var dot = new Point(, ); float angle = random.Next(-RandAngle, RandAngle);//转动的度数 graphics.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
graphics.RotateTransform(angle);
graphics.DrawString(item.ToString(CultureInfo.InvariantCulture), font, b, , , format); graphics.RotateTransform(-angle);//转回去
graphics.TranslateTransform(, -dot.Y);//移动光标到指定位置 }
}
//生成图片
var stream = new MemoryStream();
map.Save(stream, ImageFormat.Gif);
//输出图片流
return stream.ToArray();
}
}
}
05-11 18:23