随着C# WINFORMS应用程序功能的越来越复杂,需求的越来越多,那么不得不提到2个重要的接口Windows API和GDI(或者说GDI+),今天就来讲解下GDI+及其一些应用示例。
GDI(graphic device interface,图形设备接口),负责在屏幕和打印机上输出信息。GDI+是GDI的后续版本。
要使用GDI+,首先应该创建Graphics类对象(简单的来说,Graphics类对象就相当于画布,没画布我们在什么地方绘图呢?),然后调用一系列绘图方法即可,最后再释放资源(调用Graphics类对象的Dispose()方法)。
那么,第一步,创建Graphics类对象的几种方式如下
方式一,
Form类的CreateGraphics()方法。
例如:this.CreateGraphics(); //这里的this指的是当前form类
方式二,
重写Form类的On
例如:override void On
{
Graphics g = e.Graphics;
}
通过以上2种方式的了解,我们可以知道Form类的派生控件都可以生成Graphics对象,例如button、picturebox都有CreateGraphics()方法。
方式三,
把现有的图像转换为Graphics对象,参数是Image类的任何派生类。例如:
Bitmap bmap = new Bitmap("e:/test/1.jpg");//当然也可以指定宽高度进行创建
Graphics g = Graphics.FromImage(bmap);
第二步,认识基本的GDI+对象,辅助制图
1,画笔Pen对象:
Pen pen = new Pen(Color.Red);或使用系统预设的画笔,如Pen pen = Pens.Black;
可以指定一些常见属性
Width; //画笔粗细属性
Color; //画笔颜色属性
DashStyle;//画线类型属性,如pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;点线
2,笔刷对象,主要如下几种:
实心笔刷 SolidBrush solidBrush = new SolidBrush(Color.Red);//笔刷颜色为红色
阴影笔刷,在System.Drawing.Drawing2D命名空间下
HatchBrush hatchBrush = new HatchBrush(HatchStyle.Vertical,Color.Blue,Color.Green);//笔刷的阴影样式为垂直,前景色为蓝色,背景色为绿色
纹理阴影笔刷,可以理解为以图像为填充的笔刷
Image img1 = Image.FromFile("e:/test/1.jpg");
TextureBrush textureBrush = new TextureBrush(img1);
渐变笔刷,顾名思义吧
LinearGradientBrush lgbrush = new LinearGradientBrush(ClientRectangle,Color.Blue,Color.Green,LinearGradientMode.Horizontal);//参数解释,ClientRectangle为笔刷填充的范围是整个当前Form对象;渐变色由蓝色到绿色;渐变模式为水平
3,颜色对象Color
使用系统预设的Color的枚举,例如红色Color.Red;
自定义颜色 Color color = Color.FromArgb(100,110,120,130);//参数解释,100为透明度,后面为红绿蓝RGB的值
4,字体Font
Font font = new Font("黑体",24);也可用FontFamily类详细指定格式如
FontFamily fontFamily = new FontFamily("华文行楷");
Font font = new Font(fontFamily,16,FontStyle.Regular);
第三步,绘制基本图形
画线 g.DrawLine(pen,0,0,10,10); //用画笔工具在始终点进行画线
画矩形 g.DrawRectangle(pen,20,20,30,40);//用画笔工具在起点画宽度为30,长度为40的矩形
画椭圆 g.DrawEllipse(pen,30,10,20,20);//用画笔工具在圆心(30,10)横向半径为20,纵向半径为20的椭圆
画多边形 g.DrawPolygon(pen, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });
填充矩形 g.FillRectangle(sredbrush, 20, 20, 30, 40);
填充椭圆 g.FillEllipse(sredbrush, 30, 10, 20, 20);
填充多边形 g.FillPolygon(sredbrush, new PointF[] { new PointF(1, 2), new PointF(20, 10), new PointF(100, 20), new PointF(200, 50), new PointF(39, 45) });
填充扇形 g.FillPie(sredbrush, new Rectangle(20, 20, 30, 40), 90, 180); //从90度开始填充到180度
第四步,绘制文本
Font font = new Font("华文行楷",24);
g.DrawString("文本内容",font,sredbrush,50,50);//在指定坐标处绘制文本
g.DrawString("文本内容,在矩形范围内将不断字换行",font,sredbrush,new RectangleF(50,80,80,100));
第五步,绘制图像
Bitmap bitmap = new Bitmap("e:/test/1.jpg");
g.DrawImage(bitmap,0,0);//在指定位置开始绘制图像,或者
Image img = Image.FromFile("e:/test/1.jpg");
g.DrawImage(img,0,0);
验证码的示例:主要方法代码如下
//生成验证码图片,并在pbchecknum中显示 count为生成验证码的位数
void CreateCheckNum(int count) {
//生成4位验证码
string checkCode = "";
string str = "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,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";
string[] strs = str.Split(',');
Random random=new Random();
for (int i = 1; i <= count; i++)
{
checkCode+=strs[random.Next(0,strs.Length)];
}
checkNum=checkCode;
//生成验证码图像
Bitmap bg = new Bitmap((int)Math.Ceiling(checkCode.Length*12.5),22);
Graphics g = Graphics.FromImage(bg);
Font font=new Font("Arail",12,FontStyle.Bold);
LinearGradientBrush lgbrush=new LinearGradientBrush(new Rectangle(0,0,bg.Width,bg.Height),Color.Blue,Color.DarkRed,LinearGradientMode.Horizontal);
g.DrawString(checkCode,font,lgbrush,2,2);
//画干扰线
for (int i = 0; i < 4; i++)
{
int x1 = random.Next(bg.Width);
int x2 = random.Next(bg.Width);
int y1 = random.Next(bg.Height);
int y2 = random.Next(bg.Height);
g.DrawLine(new Pen(Color.GreenYellow),x1,y1,x2,y2);
}
//画干扰点
for (int i = 0; i < 100; i++)
{
int x = random.Next(bg.Width);
int y = random.Next(bg.Height);
bg.SetPixel(x,y,Color.FromArgb(random.Next()));
}
//画边框
g.DrawRectangle(new Pen(Color.Red),new Rectangle(0,0,bg.Width-1,bg.Height-1));
pbchecknum.Image = bg;//在pbchecknum中显示
//释放资源
g.Dispose();
}
最终效果图如下,其他的功能自己试着完善,不了解的还可以咨询下我
有关ASP.NET的GDI+生成验证码的主体部分没有多少区别,关键就是最终把当前页面作为图片生成,并且放在输出流种输出。验证码字符串保存在COOKIE或者SESSION中。最后通过图片控件指向此页面,点击超链接使图片控件进行URL重写再次指向此页面即可完成局部更新验证码!主要代码我找时间贴出来!
来了,现在贴出来了,就几行,了解就行,呵呵
//保存验证码字符串
Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
//Session["CheckCode"] = checkCode;//用于客户端校验码比较
//把当前页作为图片生成,方便调用,当然这要放在啊释放资源前面
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bg.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());