1、图形图像处理基础,1、GDI+绘图基础,1.1 图形设备接口(GDI+) GDI+(Graphics Device Interface Plus)是.NET中实现图形、图像及文字处理的API; 所有的API都包含在以下名词空间里: System.Drawing System.Drawing.Drawing2D System.Drawing.Imaging System.Drawing.Text,坐标系统,1.2 图形上下文和Graphics对象 C#中的“图形上下文”是屏幕上可绘制图形的区域,Graphics对象管理“图形上下文”; Graphlics对象包括了绘图、字体处理、颜色处理等各种图
2、形处理的方法,我们进行图形绘制,第一步就必须创建或获得一个Graphics对象;,1.3 颜色处理 在.NET中,使用Color结构来定义操纵色彩的方法和常量; 在.NET中,任何颜色都可以通过alpha、红、绿、蓝四个数来表示,这种表示法称为ARGB值,alpha代表颜色的透明度,这四个数的取值都是从0255; 要使用ARGB来设定颜色,需要使用Color的静态方法FromArgb来返回一个Color对象,如:Color mycolor = Color.FromArgb(0, 0, 0, 0); 此外,Color还预定义了一些Color常量,我们可以直接使用,如:Color.Red Colo
3、r.Black,1.4 图形程序的设计的一般方法 一般而言,图形程序的设计可分为以下步骤: 1、创建或者获取Graphics对象; 2、创建画图工具对象(如画笔、画刷对象); 3、调用Graphics对象的方法进行图形绘制。,2、创建画布(Graphics对象),用GDI+创建图形需要先创建一个Graphics对象,Graphics类是GDI+的核心; 创建Graphics对象类似于建立了一块画布,有了画布,才可以调用其画图方法进行绘图;,在图形程序设计中,通常使用下述两种方法创建一个Graphics对象: 1、利用窗体或控件的Paint事件中的PaintEventArgs来建立Graphic
4、s对象的引用,如:2、利用窗体或某个控件的CreateGraphics方法建立Graphics对象的引用,所建对象是控件或窗体的绘图区域,如:,3、创建绘图工具,3.1 创建画笔(Pen)对象 画笔用于绘制线条、勾勒形状轮廓或呈现其它几何表示形式; 画笔对象用Pen类来创建,画笔通常具有宽度、样式和颜色三种属性: 宽度用来确定所画线条的宽度,默认以像素为单位; 颜色确定了所画的线条颜色; 样式确定了所画线条的线型,如实线、虚线、点线等。,Pen类位于System.Drawing名词空间内,常用的构造函数有两种: public Pen(Color color);Pen pen1 = new Pe
5、n(Color.Red); public Pen(Color color, float width);Color pencolor = Color.FromArgb(0, 255, 0, 0);Pen mypen = new Pen(pencolor, 2);,3.2 创建画刷(Brush)对象 画刷对象用于填充图形区域,如实心形状、图像或文本,它指定了填充的特性; Brush类是一个抽象基类,不能用它来创建对象,GDI+系统提供了几种它的子类以供使用: SolidBrush:单色画刷 HatchBrush:阴影画刷 TextureBrush:纹理画刷 LinearGradientBrush:
6、颜色渐变画刷 PathGradientBrush:路径渐变画刷,3.2.1 单色画刷 SolidBrush类是所有Brush之中最基础的一种,属于System.Drawing.Drawing2D名词空间,其主要用途是将某一特定区域填入单一的颜色; 其构造函数如下:public SolidBrush(Color);SolidBrush bh1 = new SolidBrush(Color.Red);,Graphics g = pictureBox1.CreateGraphics(); SolidBrush b = new SolidBrush(Color.Blue); g.FillRectang
7、le(b, 10, 10, 200, 100);,3.2.2 阴影画刷 这种画刷具有两种颜色:前景色和背景色,前景色定义线条的颜色,背景色定义各线条之间间隙的颜色; 有两个构造函数 public HatchBrush(HatchStyle, Color); public HatchBrush(HatchStyle, Color, Color); 其中HatchStyle为枚举类型,定义了阴影画刷的样式,常用取值如下表所示:,HatchBrush hb = new HatchBrush(HatchStyle.Cross, Color.Red);,Graphics g = pictureBox1.
8、CreateGraphics(); HatchBrush b = new HatchBrush(HatchStyle.Cross, Color.Blue); g.FillRectangle(b, 10, 10, 200, 100);,3.3.3 渐变画刷 渐变画刷用于在某一特定的区域内产生渐变效果,一般而言,常见的渐变效果是由两个颜色逐渐变化而来的; 在.NET中有两种渐变画刷: LinearGradientBrush:可以显示线型渐变效果(线性渐变); PathGradientBrush:可以显示比较有弹性的渐变效果(路径渐变)。,LinearGradientBrush的构造函数public
9、 LinearGradientBrush(Point point1,Point point2,Color color1,Color color2);其中:point1:表示渐变起始点;point2:渐变终结点;color1:表示渐变起始颜色;color2:渐变终结颜色。,Graphics g = pictureBox1.CreateGraphics(); LinearGradientBrush b = new LinearGradientBrush(new Point(0,0), new Point(300, 200),Color.Red,Color.Black); g.FillRectang
10、le(b, 0, 0, 300, 200);,4、Graphics对象的常用画图方法,4.1 画直线 Graphics对象的DrawLine方法提供了在两点间画直线的方法,它有两种使用方法: public void DrawLine(Pen, int, int, int, itn); public void DrawLine(Pen, Point, Point); 其中,第一个参数给出了画直线的画笔工具,在画笔工具里包含了线条粗细、颜色与样式等信息,而后面的参数则给出了直线的起点与终点,如: Graphics g = this.CreateGraphics(); g.DrawLine(new
11、Pen(Color.Red), 10, 10, 100, 100);,4.2 画矩形 (1)绘制空心矩形 采用Graphics对象的DrawRectangle方法可使用指定的画笔绘制一空心矩形,使用方法如下: DrawRectangle(Pen p, int x, int y, int width, int height); (2)绘制实心矩形 采用Graphics对象的FillRectangle方法可使用指定的画刷绘制一实心矩形,使用方法如下: FillRectangle(Brush b, int x, int y, int widht, int height);,DrawRectangle
12、,FillRectangle,4.3 画椭圆 (1)绘制空心椭圆 使用Graphics对象的DrawEllipse方法可使用指定的画笔绘制一空心椭圆:DrawEllipse(Pen p, int x, int y, int width, int height);DrawEllipse(Pen p, Rectangle rect); (2)绘制实心椭圆 使用Graphics对象的FillEllipse方法可使用指定的画刷绘制一实心椭圆:FillEllipse(Brush b, int x, int y, int widht, int height);FillEllipse(Brush b, Re
13、ctangle rect);,Pen p = new Pen(Color.Red); g.DrawEllipse(p, 10, 10, 200, 100);,SolidBrush b = new SolidBrush(Color.Red); g.FillEllipse(b, 10, 10, 200, 100);,4.4 绘制弧线 弧是椭圆的一部分,计量单位为度,我们把从“起始角”开始的连续角度称作弧度,弧线就是从起始角开始,按照弧度旋转而成的线段; 按顺时针旋转的弧度为正,按逆时针旋转的弧度为负,如:,在绘制椭圆时,我们使用椭圆的边界矩形来指定椭圆的尺寸,因此绘制弧线时也需要按照边界矩形来确定
14、尺寸; 常用的绘制弧线的方法有以下三个: (1)DrawArc方法,绘制一段弧线,格式如下: DrawArc(Pen p, int x, int y, int width, int height,int startAngle, int sweepAngle); 其中,startAngle为起始角度,sweepAngle为旋转度;,(2)DrawPie方法,用于画一条弧线,并将弧的两个端点与圆心相连,即画出一个扇形轮廓,使用方法: DrawPie(Pen p, int x, int y, int width, int height,int startAngle, int sweepAngle);
15、 其中各参数的意义与DrawArc类似; (3)FillPie方法,使用指定画刷填充扇形,使用方法: FillPie(Brush b, int x, int y, int width, int height,int startAngle, sweepAngle);,g.DrawArc(p, 10, 10, 200, 100, 0, 90);,g.DrawPie(p, 10, 10, 200, 100, 0, 90);,SolidBrush b = new SolidBrush(Color.Red); g.FillPie(b, 10, 10, 200, 100, 0, 90);,4.5 绘制多边
16、形与折线 Graphics对象提供了以下一些用于绘制多边形的方法: (1)DrawLines方法,绘制一系列的折线,各个折线点的坐标用Points数组指定,若最后的点不等于第一个点的坐标,那么图形不封闭,使用方法: DrawLines(Pen p, Point points); (2)DrawPolygon方法,绘制多边形,即使最后一个点和第一个点不相同,也绘制封闭多边形,使用方法: DrawPolygon(Pen p, Point points); (3)FillPolygon方法,填充多边形,使用方法: FillPolygon(Brush b, Point points);,Pen p =
17、 new Pen(Color.Red); Point points = new Point3; points0 = new Point(10, 10); points1 = new Point(60, 100); points2 = new Point(200, 20); g.DrawLines(p, points);,SolidBrush b = new SolidBrush(Color.Red); g.FillPolygon(b, points);,g.DrawPolygon(p, points);,5、图像处理概述,5.1 图像文件类型 使用GDI+可以显示和处理多种格式的图像文件,其中
18、主要包括: 位图(*.bmp) Icon(*.ico) GIF(*.gif) JPEG(*.jpg),5.2 图像对象 在.NET中,进行图像处理一般是通过Image类及其派生类来实现; Image类是一个抽象类,不能直接使用,实践中主要使用它的派生类Bitmap类; Bitmap类封装了GDI+位图,可以处理由像素数据定义的图像,该类属于System.Drawing名词空间;,Bitmap类的构造函数: Bitmap(string filename); Bitmap(Image img); Bitmap(Stream stream); Bitmap bm = new Bitmap(“test
19、.bmp”); Bitmap类的GetPixel和SetPixel方法: GetPixel方法用于获取图像中指定像素的颜色; SetPixel方法用于设定图像中指定像素的颜色; Bitmap bm = new Bitmap(“test.jpg”); Color c = bm.GetPixel(100, 100); c.R = c.R / 2; bm.SetPixel(100, 100, c);,6、图像的显示和保存,在程序中,用于显示图片常用pictureBox控件,要在该控件上显示图片,需设置其Image属性,通过属性框或者程序运行时的OpenFileDialog对话框,可以指定Image属
20、性; Bitmap image = new Bitmap(filename); pictureBox1.Image = image;,保存图像可以使用Bitmap类的Save方法,该方法的使用方式主要有以下两种: Save(string filename); Save(string filename, ImageFormat format);Bitmap bm = new Bitmap(“test.bmp”); bm.Save(“test.jpg”, ImageFormat.Jpeg); 注:ImageFormat类位于System.Drawing.Imaging 里,7、图像拷贝和粘贴,在C
21、#中,Clipboard类提供了将数据放在系统剪贴板和从系统剪贴板恢复数据的方法,它位于名词空间System.Windows.Forms 里; Clipboard类只有三个成员: 构造函数: SetDataObject:该静态方法实现往剪贴板上写数据,使用方式如下: Clipboard.SetDataObject(Object obj);,GetDataObject:该静态方法负责从剪贴板中获取数据,它将返回IDataObject,可以使用IDataObject的GetDataPresent方法来判断当前数据是否是指定的数据,然后使用GetData方法获取指定格式的数据,如:IDataObje
22、ct dtObj = Clipboard.GetDataObject();if(dtObj.GetDataPresent(DataFormats.Bitmap)Image im = dtObj.GetData(DataFormats.Bitmap);,实例: 1、建立Windows应用程序项目; 2、设计界面如下:,3、编写“复制”按钮的单击事件处理程序:4、编写“粘贴”按钮的单击事件处理程序:,8、图像处理应用实例,实例1 改变图像分辨率 图像的分辨率决定了图像与原物的逼近程度,对同一大小的图像,像素越多,即将图像分割得越细,图像就越逼真,这就称为分辨率高,反之为分辨率低; 练习:将256*256分辨率的图像变换为64*64分辨率; 1、创建Windows应用程序项目;,2、设计程序界面如下:,3、处理按钮单击事件:,实例2 彩色图像变换为灰度图像 1 、创建Windows应用程序项目; 2、设计界面如下:,3、编写按钮单击事件:,作业,设计如下图所示的Windows应用程序:,