7.3绘图
GDI+
类1.System.Drawing
2.System.Drawing.Drawing2D
3.System.Drawing.Imaging
4.System.Drawing.Text
5.System.Drawing.Printing
GDI+的作用:
(与图形硬件设备无关的应用程序) 应用程序 顶层
GDI+ 中间层
图形硬件 底层
7.3.1C#绘图机制
Windows窗体提供的图形类型分为下面三类:
1.二维矢量图形
二维矢量图形是绘图的基本元素(例如,直线、曲线和图形)。它们由坐标系统上的一些点和另外一些描述参数指定。例如,直线可通过它的两个端点来指定;而矩形可通过确定其左上角的点并给出其宽度和高度的一对数字来指定:简单路径可通过由直线连接的点的数组来指定;贝塞尔样条曲线是由4个控制点指定的复杂曲线。
GDI+提供了存储基元(基本元素)自身信息的类和结构、存储基元绘制方式信息的类,以及实际行进绘制的类。例如,Rectangle结构存储矩形的位置和尺寸:Pen类存储有关线条颜色、线条粗细和线型的信息;而Graphics类具有用于绘制直线、矩形、路径和其他图形的方法。还有几种Brush类,它们存储了有关如何使用颜色或图案来填充封闭图形和路径的信息。
我们可以在元文件中记录表示图形命令序列的矢量图像。GDI+提供了用于记录、显示和保存元文件的Metafile类。使用MetafileHeader和MetaHeader类可以检查存储在元文件头中的数据。
2.图像处理
某些种类的图片很难或者根本无法用矢量图形技术来显示。例如,工具栏按钮上的图片和显示为图标的图片就难以指定为直线和曲线的集合。色彩丰富且分辨率高的数码照片会更难以使用矢量技术来制作。这种类型的图像更适合存储为位图。GDI+提供了用于显示、操作和保存位图的Bitmap类。
3.板式
版式是指以各种字体、大小和样式显示文本。GDI+提供了对这种复杂任务的广泛支持。GDI+中的新功能之一是子像素消除锯齿,它可以使文本在LCD(Liquid Crystal Display)屏幕上呈现时显得比较平滑。
另外,wlndows窗体还提供了在TextRenderer类中使用GDI功能绘制文本的选项。
在后面的章节中,我们将具体介绍如何绘制二维矢量图形和文本。
===========================================================
一般来说,绘图至少分为下面两个步骤。
第一步,获得Graphics对象。
要在应用程序中绘图,要先获得Graphics对象,然后才可以使用GDI+绘制线条和形状、呈现文本或显示与操作图像。这个对象可以通过下面这几种方式获取。
(1)在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs的一部分(PaintEventArgs.Graphics)。在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。
(2)调用某控件或窗体的CreateGraphics方法以获取对Graphics对象的引用,该对象表示该控件或窗体的绘图图面。如果在已存在的窗体或控件上绘图,最好使用此方法。
(3)由从Image继承的任何对象创建Graphics对象。此方法在更改已存在的图像时十分有用。
第二步,绘制和操作形状与图像。
Graphics对象在创建后,可用于绘制线条和形状、呈现文本或显示与操作图像。与Graphics对象一起使用的主要对象有以下4种。
●Pen类——用于绘制线条、勾勒形状轮廓或呈现其他几何表示形式。
●Bmsh类——用于填充图形区域,如实心形状、图像或文本。
●Font类——提供在呈现文本时要使用什么形状的有关说明。
●Color类——表示要显示的不同颜色。
Graphics类是GDI+的核心功能,它是实际绘制直线、曲线、图形、图像和文本的类。
Graphics的FillRectangle方法可以接收指向LinearGradientBrush对象的指针,该对象与Graphics对象配合工作以使用一种渐变色填充矩形。Font和StringFormat对象影响Graphics对象绘制文本的方式。Matrix对象存储并操作Graphics对象的世界变换,该对象用于旋转、缩放和翻转图像。
GDI+提供了用于组织图形数据的几种结构(例如Rectangle、Pointt和Size)。而且某些类的主要作用是结构化数据类型。例如,BitmapData类是Bitmap类的帮助器;PathData类是GraphicsPath类的帮助器。
GDI+定义了几种枚举,它们是相关常数的集合。例如,LineJoin枚举包含元素Bevel、Miter和Round,它们指定用于连接两个线条的线型。
在接下来的几节里,我们使用几个例子进一步向读者展现Graphics的使用方法。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最近对GDI+这个东西接触的比较多,也做了些简单的实例,比如绘图板,仿QQ截图等.
最早接触这个类,是因为想做仿QQ截图的效果.巧的很,学会了如何做截图后,.NET课堂上老师也正巧要讲关于c#绘图方面的知识,并且我自己又在网上学习金老师的培训班,也是要用到这个类.在学习中有一些体会,所以准备把这些体会记下来,因为内容比较多,可能我会分几次写.
废话不多说了,我们先来认识一下这个GDI+,看看它到底长什么样.
GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用DirectX处理三维(3D)的图形图像,图形图像处理用到的主要命名空间是System . Drawing:提供了对GDI+基本图形功能的访问,主要有Graphics类、Bitmap类、从Brush类继承的类、Font类、Icon类、Image类、Pen类、Color类等.
大概了解了什么是GDI+后,我们来看一下绘图要用到的主要工具,要画图,肯定要画板吧,在C#中画板可以通过Graphics这个类来创建,有了画板,总得弄个笔什么之类的吧,不然怎么画呀,难不成我们用手指画.笔又可以分好多种类,比如铅笔,画刷等.它们的区别主要是铅笔可以用来画线条,而画刷呢,嘿嘿,自己考虑下.在c#中我们可以用Pen,Brush类来实现类似功能.颜料则自然是用Color类了.
有了工具,我们就可以开始动手了!(所需命名空间:using System.Drawing;)
实现效果:在空白窗体中画基本图形
首先准备一个画板:
创建一个画板主要有3种方式:
A: 在窗体或控件的Paint事件中直接引用Graphics对象
B: 利用窗体或某个控件的CreateGraphics方法
C: 从继承自图像的任何对象创建Graphics对象
这次我们就先以A为例说明问题:
private
void
Form1_Paint(
object
sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
}
然后,我们要只笔:
private
void
Form1_Paint(
object
sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
}
接下来我们就可以来画画了.
private
void
Form1_Paint(
object
sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
g.DrawLine(p, 10, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
g.DrawRectangle(p, 10, 10, 100, 100);//在画板上画矩形,起始坐标为(10,10),宽为,高为
g.DrawEllipse(p, 10, 10, 100, 100);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为
}
效果图如下:
最近一直在画自定义控件,所以研究一下GDI+对画图的操作,先介绍一下GDI,全称为Graphics Device Interface,含义是图形设备接口,它的主要任务就是负责系统与绘图程序之间的信息交换。
对于画图其实并不是很麻烦的,我们只需要会用几个对象就行,一个是Graphics对象,该对象封装了一个绘图图面,Graphics对象的创建一般是用控件自带的CreateGraphics()方法得到该对象,还可以用控件的Paint或者重写窗体的OnPaint事件里面有一个PaintEventArgs e的参数,用e.Graphics获取Graphics对象,另一种方法是Bitmap bitmap = new Bitmap(this.Width, this.Height); Graphics gra = Graphics.FromImage(bitmap); 创建。这个对象是画图必须的
有了画面,我们下面要得就是画笔了,在这里我们用到是Pen类,它提供了画笔,创建简单的画笔我们只需要Pen p=Pens.Red;Pens提供了各种颜色的画笔,我们还可以用new来创建画笔。例如:Pen p = new Pen(Color.Blue,12);该句是创建了一个颜色为蓝色,宽度为12的画笔。
这些对象都是System.Drawing;命名空间所提供的,
现在我们用窗体的Paint事件来举一个画矩形的简单的例子:
Graphics g = e.Graphics; //利用该事件的参数e创建画面对象
Rectangle r = new Rectangle(10, 10, 300, 200);//是创建画矩形的区域
g.DrawRectangle(Pens.Red, r);//g对象提供了画图形的方法,我们只需调用即可
上边图就 是该三句代码所完成的,只是画了一个矩形的轮廓,g对象还提供了填充画的区域方法:如
实现填充我们将用到g对象的提供另一个方法,g.FillRectangle(Brushes.Red, r);另外还用到了Brush对象,该对象是画刷,用来填充指定的颜色的,它的创建和Pen的创建是一样的,可以用new,也可以用Brushes类来直接创建
画其他图形和画矩形是一样的,我们只需调用相应的方法即可,可以自己试试