CGDI编程教程CGDI编程教程.docx

上传人:b****0 文档编号:18281286 上传时间:2023-08-15 格式:DOCX 页数:57 大小:926.62KB
下载 相关 举报
CGDI编程教程CGDI编程教程.docx_第1页
第1页 / 共57页
CGDI编程教程CGDI编程教程.docx_第2页
第2页 / 共57页
CGDI编程教程CGDI编程教程.docx_第3页
第3页 / 共57页
CGDI编程教程CGDI编程教程.docx_第4页
第4页 / 共57页
CGDI编程教程CGDI编程教程.docx_第5页
第5页 / 共57页
CGDI编程教程CGDI编程教程.docx_第6页
第6页 / 共57页
CGDI编程教程CGDI编程教程.docx_第7页
第7页 / 共57页
CGDI编程教程CGDI编程教程.docx_第8页
第8页 / 共57页
CGDI编程教程CGDI编程教程.docx_第9页
第9页 / 共57页
CGDI编程教程CGDI编程教程.docx_第10页
第10页 / 共57页
CGDI编程教程CGDI编程教程.docx_第11页
第11页 / 共57页
CGDI编程教程CGDI编程教程.docx_第12页
第12页 / 共57页
CGDI编程教程CGDI编程教程.docx_第13页
第13页 / 共57页
CGDI编程教程CGDI编程教程.docx_第14页
第14页 / 共57页
CGDI编程教程CGDI编程教程.docx_第15页
第15页 / 共57页
CGDI编程教程CGDI编程教程.docx_第16页
第16页 / 共57页
CGDI编程教程CGDI编程教程.docx_第17页
第17页 / 共57页
CGDI编程教程CGDI编程教程.docx_第18页
第18页 / 共57页
CGDI编程教程CGDI编程教程.docx_第19页
第19页 / 共57页
CGDI编程教程CGDI编程教程.docx_第20页
第20页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

CGDI编程教程CGDI编程教程.docx

《CGDI编程教程CGDI编程教程.docx》由会员分享,可在线阅读,更多相关《CGDI编程教程CGDI编程教程.docx(57页珍藏版)》请在冰点文库上搜索。

CGDI编程教程CGDI编程教程.docx

CGDI编程教程CGDI编程教程

第7章C#图形图像编程基础

本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。

7.1GDI+绘图基础

编写图形程序时需要使用GDI(GraphicsDeviceInterface,图形设备接口),从程序设计的角度看,GDI包括两部分:

一部分是GDI对象,另一部分是GDI函数。

GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(GraphiceDeviceInterfacePlus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。

7.1.1GDI+概述

GDI+是微软在Windows2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:

(1)二维矢量图形:

GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。

(2)图像处理:

大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。

因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。

(3)文字显示:

GDI+支持使用各种字体、字号和样式来显示文本。

我们要进行图形编程,就必须先讲解Graphics类,同时我们还必须掌握Pen、Brush和Rectangle这几种类。

GDI+比GDI优越主要表现在两个方面:

(一)GDI+通过提供新功能(例如:

渐变画笔和alpha混合)扩展了GDI的功能;第

(二)修订了编程模型,使图形编程更加简易灵活。

7.1.2Graphics类

Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联。

画图方法都被包括在Graphics类中,在画任何对象(例如:

Circle,Rectangle)时,我们首先要创建一个Graphics类实例,这个实例相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。

绘图程序的设计过程一般分为两个步骤:

(一)创建Graphics对象;

(二)使用Graphics对象的方法绘图、显示文本或处理图像。

通常我们使用下述三种方法来创建一个Graphics对象。

方法一、利用控件或窗体的Paint事件中的PainEventArgs

在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用的Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。

例如:

//窗体的Paint事件的响应方法

privatevoidform1_Paint(objectsender,PaintEventArgse)

{

Graphicsg=e.Graphics;

}

也可以直接重载控件或窗体的OnPaint方法,具体代码如下所示:

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

}

Paint事件在重绘控件时发生。

方法二、调用某控件或窗体的CreateGraphics方法

调用某控件或窗体的CreateGraphics方法以获取对Graphics对象的引用,该对象表示该控件或窗体的绘图图面。

如果想在已存在的窗体或控件上绘图,通常会使用此方法。

例如:

Graphicsg=this.CreateGraphics();

方法三、调用Graphics类的FromImage静态方法

由从Image继承的任何对象创建Graphics对象。

在需要更改已存在的图像时,通常会使用此方法。

例如:

//名为“g1.jpg”的图片位于当前路径下

Imageimg=Image.FromFile("g1.jpg");//建立Image对象

Graphicsg=Graphics.FromImage(img);//创建Graphics对象

1.Graphics类的方法成员

有了一个Graphics的对象引用后,就可以利用该对象的成员进行各种各样图形的绘制,表7.1列出了Graphics类的常用方法成员。

表7.1Graphics类常用方法

名称

说明

DrawArc

画弧。

DrawBezier

画立体的贝尔塞曲线。

DrawBeziers

画连续立体的贝尔塞曲线。

DrawClosedCurve

画闭合曲线。

DrawCurve

画曲线。

DrawEllipse

画椭圆。

DrawImage

画图像。

DrawLine

画线。

DrawPath

通过路径画线和曲线。

DrawPie

画饼形。

DrawPolygon

画多边形。

DrawRectangle

画矩形。

DrawString

绘制文字。

FillEllipse

填充椭圆。

FillPath

填充路径。

FillPie

填充饼图。

FillPolygon

填充多边形。

FillRectangle

填充矩形。

FillRectangles

填充矩形组。

FillRegion

填充区域。

在.NET中,GDI+的所有绘图功能都包括在System、System.Drawing、System.Drawing.Imaging、System.Drawing.Darwing2D和System.Drawing.Text等命名空间中,因此在开始用GDI+类之前,需要先引用相应的命名空间。

2.引用命名空间

在C#应用程序中使用using命令已用给定的命名空间或类,下面是一个C#应用程序引用命名空间的例子:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Data;

usingSystem.ComponentModel;

usingSystem.Drawing;

usingSystem.Drawing.Drawing2D;

usingSystem.Drawing.Imaging;

7.1.3常用画图对象

在创建了Graphics对象后,就可以用它开始绘图了,可以画线、填充图形、显示文本等等,其中主要用到的对象还有:

●Pen:

用来用patterns、colors或者bitmaps进行填充。

●Color:

用来画线和多边形,包括矩形、圆和饼形。

●Font:

用来给文字设置字体格式。

●Brush:

用来描述颜色。

●Rectangle:

矩形结构通常用来在窗体上画矩形。

●Point:

描述一对有序的x,y两个坐标值。

1.Pen类

Pen用来绘制指定宽度和样式的直线。

使用DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理。

使用画笔时,需要先实例化一个画笔对象,主要有以下几种方法。

用指定的颜色实例化一只画笔的方法如下:

publicPen(Color);

用指定的画刷实例化一只画笔的方法如下:

publicPen(Brush);

用指定的画刷和宽度实例化一只画笔的方法如下:

publicPen(Brush,float);

用指定的颜色和宽度实例化一只画笔的方法如下:

publicPen(Color,float);

实例化画笔的语句格式如下:

Penpn=newPen(Color.Blue);

或者Penpn=newPen(Color.Blue,100);

Pen常用的属性有以下几个,如表7.2所示:

表7.2Pen常用属性

名称

说明

Alignment

获得或者设置画笔的对齐方式。

Brush

获得或者设置画笔的属性。

Color

获得或者设置画笔的颜色。

Width

获得或者设置画笔的宽度。

2.Color结构

在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。

在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操作。

Color结构的基本属性如表7.3所示。

表7.3颜色的基本属性

名称

说明

A

获取此Color结构的alpha分量值,取值(0~255)。

B

获取此Color结构的蓝色分量值,取值(0~255)。

G

获取此Color结构的绿色分量值,取值(0~255)。

R

获取此Color结构的红色分量值,取值(0~255)。

Name

获取此Color结构的名称,这将返回用户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的),对于自定义的颜色,将返回RGB值。

Color结构的基本(静态)方法如表7.4所示

表7.4颜色的基本方法

名称

说明

FromArgb

从四个8位ARGB分量(alpha、红色、绿色和蓝色)值创建Color结构。

FromKnowColor

从指定的预定义颜色创建一个Color结构。

FromName

从预定义颜色的指定名称创建一个Color结构。

Color结构变量可以通过已有颜色构造,也可以通过RGB建立,例如:

Colorclr1=Color.FromArgb(122,25,255);

Colorclr2=Color.FromKnowColor(KnowColor.Brown);//KnownColor为枚举类型

Colorclr3=Color.FromName("SlateBlue");

在图像处理中一般需要获取或设置像素的颜色值,获取一幅图像的某个像素颜色值的具体步骤如下:

(1)定义Bitmap

BitmapmyBitmap=newBitmap("c:

\\MyImages\\TestImage.bmp");

(2)定义一个颜色变量把在指定位置所取得的像素值存入颜色变量中

Colorc=newColor();

c=myBitmap.GetPixel(10,10);//获取此Bitmap中指定像素的颜色。

(3)将颜色值分解出单色分量值

intr,g,b;

r=c.R;

g=c.G;

b=c.B;

3.Font类

Font类定义特定文本格式,包括字体、字号和字形属性。

Font类的常用构造函数是publicFont(string字体名,float字号,FontStyle字形),其中字号和字体为可选项和publicFont(string字体名,float字号),其中“字体名”为Font的FontFamily的字符串表示形式。

下面是定义一个Font对象的例子代码:

FontFamilyfontFamily=newFontFamily("Arial");

Fontfont=newFont(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);

字体常用属性如表7.5所示。

表7.5字体的常用属性

名称

说明

Bold

是否为粗体。

FontFamily

字体成员。

Height

字体高。

Italic

是否为斜体。

Name

字体名称。

Size

字体尺寸。

SizeInPoints

获取此Font对象的字号,以磅为单位。

Strikeout

是否有删除线。

Style

字体类型。

Underline

是否有下划线。

Unit

字体尺寸单位。

4.Brush类

Brush类是一个抽象的基类,因此它不能被实例化,我们总是用它的派生类进行实例化一个画刷对象,当我们对图形内部进行填充操作时就会用到画刷,关于画刷在7.1.5中有详细讲解。

5.Rectangle结构

存储一组整数,共四个,表示一个矩形的位置和大小。

矩形结构通常用来在窗体上画矩形,除了利用它的构造函数构造矩形对象外,还可以使用Rectangle结构的属性成员,其属性成员如表7.6所示。

表7.6Rectangle结构属性

名称

说明

Bottom

底端坐标

Height

矩形高

IsEmpty

测试矩形宽和高是否为0

Left

矩形左边坐标

Location

矩形的位置

Right

矩形右边坐标

Size

矩形尺寸.

Top

矩形顶端坐标

Width

矩形宽

X

矩形左上角顶点X坐标

Y

矩形左上角顶点Y坐标

Retangle结构的构造函数有以下两个:

//用指定的位置和大小初始化Rectangle类的新实例。

publicRetangle(Point,Size);//Size结构存储一个有序整数对,通常为矩形的宽度和高度。

publicRectangle(int,int,int,int);

6.Point结构

用指定坐标初始化Point类的新实例。

这个结构很像C++中的Point结构,它描述了一对有序的x,y两个坐标值,其构造函数为:

publicPoint(intx,inty);其中x为该点的水平位置;y为该点的水垂直位置。

下面是构造Point对象的例子代码:

Pointpt1=newPoint(30,30);

Pointpt2=newPoint(110,100);

7.1.4基本图形绘制举例

1.画一个矩形

【例7.1】建立一个项目,在窗体上画一个矩形,通过直接在Form1类中重载OnPaint函数的方法来实现。

图7.1画一个矩形

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

Rectanglerect=newRectangle(50,30,100,100);

LinearGradientBrushlBrush=newLinearGradientBrush(rect,Color.Red,Color.Yellow,LinearGradientMode.BackwardDiagonal);

g.FillRectangle(lBrush,rect);

}

运行结果如图7.1所示。

2.画一个弧

【例7.2】画一个弧形。

弧形函数格式如下:

publicvoidDrawArc(Penpen,Rectanglerect,FloatstartArgle,FloatsweepAngle);

直接在Form1类中重载OnPaint函数

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

Penpn=newPen(Color.Blue);

Rectanglerect=newRectangle(50,50,200,100);

g.DrawArc(pn,rect,12,84);

}

运行结果如图7.2所示。

图7.2画一个弧

3.画线

【例7.3】画一条线。

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

Penpn=newPen(Color.Blue);

Pointpt1=newPoint(30,30);

Pointpt2=newPoint(110,100);

g.DrawLine(pn,pt1,pt2);

}

运行结果如图7.3所示。

图7.3画一条线

4.画椭圆

【例7.4】画一个椭圆。

图7.4画一个椭圆

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

Penpn=newPen(Color.Blue,100);

Rectanglerect=newRectangle(50,50,200,100);

g.DrawEllipse(pn,rect);

}

运行结果如图7.4所示。

5.输出文本

【例7.5】输出文本。

protectedoverridevoidOnPaint(PaintEventArgse)

{

Fontfnt=newFont("Verdana",16);

Graphicsg=e.Graphics;

g.DrawString("GDI+World",fnt,newSolidBrush(Color.Red),14,10);

}

运行结果如图7.5所示。

图7.5输出文本

6.填充路径

【例7.6】填充路径。

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

g.FillRectangle(newSolidBrush(Color.White),ClientRectangle);

GraphicsPathpath=newGraphicsPath(newPoint[]{

newPoint(40,140),newPoint(275,200),

newPoint(105,225),newPoint(190,300),

newPoint(50,350),newPoint(20,180),},

newbyte[]{

(byte)PathPointType.Start,

(byte)PathPointType.Bezier,

(byte)PathPointType.Bezier,

(byte)PathPointType.Bezier,

(byte)PathPointType.Line,

(byte)PathPointType.Line,

});

PathGradientBrushpgb=newPathGradientBrush(path);

pgb.SurroundColors=newColor[]

{

Color.Green,Color.Yellow,Color.Red,Color.Blue,

Color.Orange,Color.White,

};

g.FillPath(pgb,path);

}

运行结果如图7.6所示。

图7.6填充路径

注意:

GraphicsPath类位于命名空间System.Drawing.Drawing2D中,表示一系列相互连接的直线和曲线。

7.1.5画刷和画刷类型

Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:

HatchBrush、SolidBrush和TextureBrush等。

画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间。

1.SolidBrush(单色画刷)

它是一种一般的画刷,通常只用一种颜色去填充GDI+图形,例如:

protectedoverridevoidOnPaint(PaintEventArgse)

{

Graphicsg=e.Graphics;

SolidBrushsdBrush1=newSolidBrush(Color.Red);

SolidBrushsdBrush2=newSolidBrush(Color.Green);

SolidBrushsdBrush3=newSolidBrush(Color.Blue);

g.FillEllipse(sdBrush2,20,40,60,70);

Rectanglerect=newRectangle(0,0,200,100);

g.FillPie(sdBrush3,0,0,200,40,0.0f,30.0f);

PointFpoint1=newPointF(50.0f,250.0f);

PointFpoint2=newPointF(100.0f,25.0f);

PointFpoint3=newPointF(150.0f,40.0f);

PointFpoint4=newPointF(250.0f,50.0f);

PointFpoint5=newPointF(300.0f,100.0f);

PointF[]curvePoints={point1,point2,point3,point4,point5};

g.FillPolygon(sdBrush1,curvePoints);

}

运行结果如图7.7所示。

图7.7SolidBrush应用

2.HatchBrush(阴影画刷)

HatchBrush类位于System.Drawing.Drawing2D命名空间中。

阴影画刷有两种颜色:

前景色和背景色,以及6种阴影。

前景色定义线条的颜色,背景色定各线条之间间隙的颜色。

HatchBrush类有两个构造函数:

●publicHatchBrush(HatchStyle,Colorforecolor);

●publicHatchBrush(HatchStyle,Colorforecolor,Colorbackcolor);

HatchStyle枚举值指定可用于HatchBrush对象的不同图案。

HatchStyle的主要成员如表7.7所示。

表7.7HatchStyle主要成员

名称

说明

BackwardDiagonal

从右上到左下的对角线的线条图案。

Cross

指定交叉的水平线和垂直线。

DarkDownwardDiagonal

指定从顶点到底点向右倾斜的对角线,其两边夹角比ForwardDiagonal小50%,宽度是其两倍。

此阴影图案不是锯齿消除的。

DarkHorizontal

指定水平线的两边夹角比Horizontal小50%并且宽度是Horizontal的两倍。

DarkUpwardDiagonal

指定从顶点到底点向左倾斜的对角线,其两边夹角比BackwardDiagonal小50%,宽度是其两倍,但这些直线不是锯齿消除的。

DarkVertical

指定垂直线的两边夹角比Vertical小50%并且宽度是其两倍。

DashedDownwardDiagonal

指定虚线对角线,这些对角线从顶点到底点向右倾斜。

DashedHorizontal

指定虚线水平线。

DashedUpwardD

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2