GDI+简介及其应用示例

随着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类的OnPaint事件方法,通过其中的PaintEventArgs对象的Graphics属性来创建。

例如:override void OnPaint(PaintEventArgs e)
        {
           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();
        }

最终效果图如下,其他的功能自己试着完善,不了解的还可以咨询下我

GDI+简介及其应用示例 - 天涯的海风 - 天涯的海风

有关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());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值