C# GDI+图形图像技术
一、概述:
编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数。GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphice Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。
GDI+ 指的是.NET Framework4.0 中提供的二维图形、图像处理等功能。是构成windows操作系统的一个子系统。它提供了图像图像操作的应用程序编程接口(API)。
使用GDI+可以用相同的方式在屏幕或者打印机上显示信息,而无需考虑特定显示器的细节。GDI+将应用程序与图像硬件分隔开,使程序员能够创建与设备无关的应用程序。
GDI+主要用于在窗体上绘制各种图像图像,就像是一个绘图仪。
GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:
(1) 二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。
(2) 图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。
(3) 文字显示:GDI+支持使用各种字体、字号和样式来显示文本。
我们要进行图形编程,就必须先讲解Graphics类,同时我们还必须掌握Pen、Brush和Rectangle这几种类。
GDI+比GDI优越主要表现在两个方面:第(一)GDI+通过提供新功能(例如:渐变画笔和alpha混合)扩展了GDI的功能;第(二)修订了编程模型,使图形编程更加简易灵活。
Bitmap 与Graphics的区别。
你是不可能直接在 Bitmap 对象上画图的,只能先取得这个 Bitmap 的 Graphics 对象,然后在这个 Graphics 对象上操作。
Bitmap 封装 GDI+ 位图(注意:位图),是用于处理由像素数据定义的图像的对象。
Graphics 封装一个 GDI+ 绘图(注意:绘图),图面提供将对象绘制到显示设备的方法。
通俗点儿说,前者是绘画作品,后者才是真正绘画时用到的东西(比如刷子、颜料等等),两者完全不同
二、创建Graphics对象
Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联。画图方法都被包括在Graphics类中,在画任何对象(例如:Circle,Rectangle)时,我们首先要创建一个Graphics类实例,这个实例相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。
绘图程序的设计过程一般分为两个步骤:(一)创建Graphics对象;(二)使用Graphics对象的方法绘图、显示文本或处理图像。
通常我们使用下述三种方法来创建一个Graphics对象。
方法一、利用控件或窗体的Paint事件中的PainEventArgs
在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用的Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。
例如:
//窗体的Paint事件的响应方法
private void form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
}也可以直接重载控件或窗体的OnPaint方法,具体代码如下所示:
protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
}Paint事件在重绘控件时发生。
方法二、调用某控件或窗体的CreateGraphics方法
调用某控件或窗体的CreateGraphics方法以获取对Graphics对象的引用,该对象表示该控件或窗体的绘图图面。如果想在已存在的窗体或控件上绘图,通常会使用此方法。
例如:
Graphics g = this.CreateGraphics();
方法三、调用Graphics类的FromImage静态方法
由从Image继承的任何对象创建Graphics对象。在需要更改已存在的图像时,通常会使用此方法。
例如:
//名为“g1.jpg”的图片位于当前路径下
Image img = Image.FromFile("g1.jpg");//建立Image对象
Graphics g = Graphics.FromImage(img);//创建Graphics对象1.Graphics类的方法成员
有了一个Graphics的对象引用后,就可以利用该对象的成员进行各种各样图形的绘制,表列出了Graphics类的常用方法成员。
Graphics类常用方法
| 名称 | 说明 | 
| 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#应用程序引用命名空间的例子:
using System; using System.Collections.Generic; using System.Data; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging;
常用画图对象
在创建了Graphics对象后,就可以用它开始绘图了,可以画线、填充图形、显示文本等等,其中主要用到的对象还有:
l Pen:用来用patterns、colors或者bitmaps进行填充。
l Color:用来画线和多边形,包括矩形、圆和饼形。
l Font:用来给文字设置字体格式。
l Brush:用来描述颜色。
l Rectangle:矩形结构通常用来在窗体上画矩形。
l Point:描述一对有序的x,y两个坐标值。
1.Pen类
Pen用来绘制指定宽度和样式的直线。使用DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理。
使用画笔时,需要先实例化一个画笔对象,主要有以下几种方法。
用指定的颜色实例化一只画笔的方法如下:
public Pen(Color);
用指定的画刷实例化一只画笔的方法如下:
public Pen(Brush);
用指定的画刷和宽度实例化一只画笔的方法如下:
public Pen(Brush, float);
用指定的颜色和宽度实例化一只画笔的方法如下:
public Pen(Color, float);
实例化画笔的语句格式如下:
Pen pn=new Pen(Color.Blue);
或者Pen pn=new Pen(Color.Blue,100);
Pen常用的属性有以下几个,如表所示:
| 名称 | 说明 | 
| Alignment | 获得或者设置画笔的对齐方式。 | 
| Brush | 获得或者设置画笔的属性。 | 
| Color | 获得或者设置画笔的颜色。 | 
| Width | 获得或者设置画笔的宽度。 | 
2.Color结构
在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操作。Color结构的基本属性如表所示。
| 名称 | 说明 | 
| A | 获取此Color结构的alpha分量值,取值(0~255)。 | 
| B | 获取此Color结构的蓝色分量值,取值(0~255)。 | 
| G | 获取此Color结构的绿色分量值,取值(0~255)。 | 
| R | 获取此Color结构的红色分量值,取值(0~255)。 | 
| Name | 获取此Color结构的名称,这将返回用户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的),对于自定义的颜色,将返回RGB值。 | 
Color结构的基本(静态)方法如表所示
| 名称 | 说明 | 
| FromArgb | 从四个8位ARGB分量(alpha、红色、绿色和蓝色)值创建Color结构。 | 
| FromKnowColor | 从指定的预定义颜色创建一个Color结构。 | 
| FromName | 从预定义颜色的指定名称创建一个Color结构。 | 
Color结构变量可以通过已有颜色构造,也可以通过RGB建立,例如:
Color clr1 = Color.FromArgb(122,25,255);
Color clr2 = Color.FromKnowColor(KnowColor.Brown);//KnownColor为枚举类型
Color clr3 = Color.FromName("SlateBlue");在图像处理中一般需要获取或设置像素的颜色值,获取一幅图像的某个像素颜色值的具体步骤如下:
(1)定义Bitmap
Bitmap myBitmap = new Bitmap("c:\\MyImages\\TestImage.bmp");(2)定义一个颜色变量把在指定位置所取得的像素值存入颜色变量中
Color c = new Color(); c = myBitmap.GetPixel(10,10);//获取此Bitmap中指定像素的颜色。
(3)将颜色值分解出单色分量值
int r,g,b; r= c.R; g=c.G; b=c.B;
3.Font类
Font类定义特定文本格式,包括字体、字号和字形属性。Font类的常用构造函数是public Font(string 字体名,float 字号,FontStyle 字形),其中字号和字体为可选项和public Font(string 字体名,float 字号),其中“字体名”为Font的FontFamily的字符串表示形式。下面是定义一个Font对象的例子代码:
FontFamily fontFamily = new FontFamily("Arial");
Font font = new Font(fontFamily,16,FontStyle.Regular,GraphicsUnit.Pixel);字体常用属性如表所示。
| 名称 | 说明 | 
| Bold | 是否为粗体。 | 
| FontFamily | 字体成员。 | 
| Height | 字体高。 | 
| Italic | 是否为斜体。 | 
| Name | 字体名称。 | 
| Size | 字体尺寸。 | 
| SizeInPoints | 获取此 Font对象的字号,以磅为单位。 | 
| Strikeout | 是否有删除线。 | 
| Style | 字体类型。 | 
| Underline | 是否有下划线。 | 
| Unit | 字体尺寸单位。 | 
4.Brush类
Brush类是一个抽象的基类,因此它不能被实例化,我们总是用它的派生类进行实例化一个画刷对象,当我们对图形内部进行填充操作时就会用到画刷,关于画刷在7.1.5中有详细讲解。
5.Rectangle结构
存储一组整数,共四个,表示一个矩形的位置和大小。矩形结构通常用来在窗体上画矩形,除了利用它的构造函数构造矩形对象外,还可以使用Rectangle结构的属性成员,其属性成员如表所示。
表 Rectangle结构属性
| 名称 | 说明 | 
| Bottom | 底端坐标 | 
| Height | 矩形高 | 
| IsEmpty | 测试矩形宽和高是否为0 | 
| Left | 矩形左边坐标 | 
| Location | 矩形的位置 | 
| Right | 矩形右边坐标 | 
| Size | 矩形尺寸. | 
| Top | 矩形顶端坐标 | 
| Width | 矩形宽 | 
| X | 矩形左上角顶点X坐标 | 
| Y | 矩形左上角顶点Y坐标 | 
Retangle结构的构造函数有以下两个:
//用指定的位置和大小初始化Rectangle类的新实例。
public Retangle(Point,Size);//Size结构存储一个有序整数对,通常为矩形的宽度和高度。 和 public Rectangle(int,int,int,int);
6.Point结构
用指定坐标初始化Point类的新实例。这个结构很像C++中的Point结构,它描述了一对有序的x,y两个坐标值,其构造函数为:public Point(int x,int y);其中x为该点的水平位置;y为该点的水垂直位置。下面是构造Point对象的例子代码:
Point pt1=new Point(30,30); Point pt2=new Point(110,100);
画刷和画刷类型
Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:HatchBrush、SolidBrush和TextureBrush等。画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间。
1.SolidBrush(单色画刷)
它是一种一般的画刷,通常只用一种颜色去填充GDI+图形.
2.HatchBrush(阴影画刷)
HatchBrush类位于System.Drawing.Drawing2D命名空间中。阴影画刷有两种颜色:前景色和背景色,以及6种阴影。前景色定义线条的颜色,背景色定各线条之间间隙的颜色。HatchBrush类有两个构造函数:
l public HatchBrush(HatchStyle,Color forecolor); l public HatchBrush(HatchStyle,Color forecolor,Color backcolor);
HatchStyle枚举值指定可用于HatchBrush对象的不同图案。
HatchStyle的主要成员如表所示。
| 名称 | 说明 | 
| BackwardDiagonal | 从右上到左下的对角线的线条图案。 | 
| Cross | 指定交叉的水平线和垂直线。 | 
| DarkDownwardDiagonal | 指定从顶点到底点向右倾斜的对角线,其两边夹角比ForwardDiagonal小50%,宽度是其两倍。此阴影图案不是锯齿消除的。 | 
| DarkHorizontal | 指定水平线的两边夹角比Horizontal小50%并且宽度是Horizontal的两倍。 | 
| DarkUpwardDiagonal | 指定从顶点到底点向左倾斜的对角线,其两边夹角比BackwardDiagonal小50%,宽度是其两倍,但这些直线不是锯齿消除的。 | 
| DarkVertical | 指定垂直线的两边夹角比Vertical小50%并且宽度是其两倍。 | 
| DashedDownwardDiagonal | 指定虚线对角线,这些对角线从顶点到底点向右倾斜。 | 
| DashedHorizontal | 指定虚线水平线。 | 
| DashedUpwardDiagonal | 指定虚线对角线,这些对角线从顶点到底点向左倾斜。 | 
| DashedVertical | 指定虚线垂直线。 | 
| DiagonalBrick | 指定具有分层砖块外观的阴影,它从顶点到底点向左倾斜。 | 
| DiagonalCross | 交叉对角线的图案。 | 
| Divot | 指定具有草皮层外观的阴影。 | 
| ForwardDiagonal | 从左上到右下的对角线的线条图案。 | 
| Horizontal | 水平线的图案。 | 
| HorizontalBrick | 指定具有水平分层砖块外观的阴影。 | 
| LargeGrid | 指定阴影样式Cross。 | 
| LightHorizontal | 指定水平线,其两边夹角比Horizontal小50%。 | 
| LightVertical | 指定垂直线的两边夹角比Vertical小50%。 | 
| Max | 指定阴影样式SolidDiamond。 | 
| Min | 指定阴影样式Horizontal。 | 
| NarrowHorizontal | 指定水平线的两边夹角比阴影样式Horizontal小 75%(或者比LightHorizontal小25%)。 | 
| NarrowVertical | 指定垂直线的两边夹角比阴影样式Vertical小 75%(或者比LightVertica小25%)。 | 
| OutlinedDiamond | 指定互相交叉的正向对角线和反向对角线,但这些对角线不是锯齿消除的。 | 
| Percent05 | 指定5%阴影。前景色与背景色的比例为5:100。 | 
| Percent90 | 指定90%阴影。前景色与背景色的比例为90:100。 | 
| Plaid | 指定具有格子花呢材料外观的阴影。 | 
| Shingle | 指定带有对角分层鹅卵石外观的阴影,它从顶点到底点向右倾斜。 | 
| SmallCheckerBoard | 指定带有棋盘外观的阴影。 | 
| SmallConfetti | 指定带有五彩纸屑外观的阴影。 | 
| SolidDiamond | 指定具有对角放置的棋盘外观的阴影。 | 
| Sphere | 指定具有球体彼此相邻放置的外观的阴影。 | 
| Trellis | 指定具有格架外观的阴影。 | 
| Vertical | 垂直线的图案。 | 
| Wave | 指定由代字号“~”构成的水平线。 | 
| Weave | 指定具有织物外观的阴影。 | 




 
                        ![拓源纯净主题tpure 修改 站长简介 [图标]](https://daobk.com/zb_users/cache/thumbs/c5b8ebcad49f36c4c34c34c798657675-210-147-1.jpg) 
                         
                         
                        