《图形图像处理基础.ppt》由会员分享,可在线阅读,更多相关《图形图像处理基础.ppt(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、图形图像处理基础1、GDI+绘图基础1.1 图形设备接口(GDI+)GDI+(Graphics Device Interface Plus)是.NET中实现图形、图像及文字处理的API;所有的API都包含在以下名词空间里:System.Drawing坐标系统1.2 图形上下文和Graphics对象C#中的“图形上下文”是屏幕上可绘制图形的区域,Graphics对象管理“图形上下文”;Graphlics对象包括了绘图、字体处理、颜色处理等各种图形处理的方法,我们进行图形绘制,第一步就必须创建或获得一个Graphics对象;1.3 颜色处理在.NET中,使用Color结构来定义操纵色彩的方法和常量
2、;在.NET中,任何颜色都可以通过alpha、红、绿、蓝四个数来表示,这种表示法称为ARGB值,alpha代表颜色的透明度,这四个数的取值都是从0255;要使用ARGB来设定颜色,需要使用Color的静态方法FromArgb来返回一个Color对象,如:Color mycolor=Color.FromArgb(0,0,0,0);此外,Color还预定义了一些Color常量,我们可以直接使用,如:Color.RedColor.Black1.4 图形程序的设计的一般方法一般而言,图形程序的设计可分为以下步骤:1、创建或者获取Graphics对象;2、创建画图工具对象(如画笔、画刷对象);3、调用G
3、raphics对象的方法进行图形绘制。2、创建画布(Graphics对象)用GDI+创建图形需要先创建一个Graphics对象,Graphics类是GDI+的核心;创建Graphics对象类似于建立了一块画布,有了画布,才可以调用其画图方法进行绘图;在图形程序设计中,通常使用下述两种方法创建一个Graphics对象:1、利用窗体或控件的Paint事件中的PaintEventArgs来建立Graphics对象的引用,如:2、利用窗体或某个控件的CreateGraphics方法建立Graphics对象的引用,所建对象是控件或窗体的绘图区域,如:3、创建绘图工具3.1 创建画笔(Pen)对象画笔用于
4、绘制线条、勾勒形状轮廓或呈现其它几何表示形式;画笔对象用Pen类来创建,画笔通常具有宽度、样式和颜色三种属性:宽度用来确定所画线条的宽度,默认以像素为单位;颜色确定了所画的线条颜色;样式确定了所画线条的线型,如实线、虚线、点线等。Pen类位于System.Drawing名词空间内,常用的构造函数有两种:public Pen(Color color);Pen pen1=new Pen(Color.Red);public Pen(Color color,float width);Color pencolor=Color.FromArgb(0,255,0,0);Pen mypen=new Pen(p
5、encolor,2);3.2 创建画刷(Brush)对象画刷对象用于填充图形区域,如实心形状、图像或文本,它指定了填充的特性;Brush类是一个抽象基类,不能用它来创建对象,GDI+系统提供了几种它的子类以供使用:SolidBrush:单色画刷HatchBrush:阴影画刷TextureBrush:纹理画刷LinearGradientBrush:颜色渐变画刷PathGradientBrush:路径渐变画刷3.2.1 单色画刷SolidBrush类是所有Brush之中最基础的一种,属于名词空间,其主要用途是将某一特定区域填入单一的颜色;其构造函数如下:public SolidBrush(Colo
6、r);SolidBrush bh1=new SolidBrush(Color.Red);Graphics g=pictureBox1.CreateGraphics();SolidBrush b=new SolidBrush(Color.Blue);g.FillRectangle(b,10,10,200,100);3.2.2 阴影画刷这种画刷具有两种颜色:前景色和背景色,前景色定义线条的颜色,背景色定义各线条之间间隙的颜色;有两个构造函数public HatchBrush(HatchStyle,Color);public HatchBrush(HatchStyle,Color,Color);其中
7、HatchStyle为枚举类型,定义了阴影画刷的样式,常用取值如下表所示:HatchBrush hb=new HatchBrush(HatchStyle.Cross,Color.Red);BackwardDiagonal从右上到左下的对角线的线条图案。Cross指定交叉的水平线和垂直线。DiagonalCross指定互相交叉的正向对角线和反向对角线。这些直线是锯齿消除的。ForwardDiagonal从左上到右下的对角线的线条图案。Horizontal水平线的图案。Vertical垂直线的图案。Graphics g=pictureBox1.CreateGraphics();HatchBrush
8、 b=new HatchBrush(HatchStyle.Cross,Color.Blue);g.FillRectangle(b,10,10,200,100);3.3.3 渐变画刷渐变画刷用于在某一特定的区域内产生渐变效果,一般而言,常见的渐变效果是由两个颜色逐渐变化而来的;在.NET中有两种渐变画刷:LinearGradientBrush:可以显示线型渐变效果(线性渐变);PathGradientBrush:可以显示比较有弹性的渐变效果(路径渐变)。LinearGradientBrush的构造函数public LinearGradientBrush(Point point1,Point po
9、int2,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.FillRectangle(b,0,0,300,200);4、Graphics对象的常用画图方法4.1 画直线Graphic
10、s对象的DrawLine方法提供了在两点间画直线的方法,它有两种使用方法:public void DrawLine(Pen,int,int,int,itn);public void DrawLine(Pen,Point,Point);其中,第一个参数给出了画直线的画笔工具,在画笔工具里包含了线条粗细、颜色与样式等信息,而后面的参数则给出了直线的起点与终点,如:Graphics g=this.CreateGraphics();g.DrawLine(new Pen(Color.Red),10,10,100,100);4.2 画矩形(1)绘制空心矩形采用Graphics对象的DrawRectangl
11、e方法可使用指定的画笔绘制一空心矩形,使用方法如下: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);DrawRectangleFillRectangle4.3 画椭圆(1)绘制空心椭圆使用Graphics对象的DrawEllipse方法可使用指定的画笔绘制一空心椭圆:DrawEllipse(Pen p,in
12、t 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,Rectangle rect);Pen p=new Pen(Color.Red);g.DrawEllipse(p,10,10,200,100);SolidBrush b=new SolidBrush(Color.Red
13、);g.FillEllipse(b,10,10,200,100);4.4 绘制弧线弧是椭圆的一部分,计量单位为度,我们把从“起始角”开始的连续角度称作弧度,弧线就是从起始角开始,按照弧度旋转而成的线段;按顺时针旋转的弧度为正,按逆时针旋转的弧度为负,如:在绘制椭圆时,我们使用椭圆的边界矩形来指定椭圆的尺寸,因此绘制弧线时也需要按照边界矩形来确定尺寸;常用的绘制弧线的方法有以下三个:(1)DrawArc方法,绘制一段弧线,格式如下:DrawArc(Pen p,int x,int y,int width,int height,int startAngle,int sweepAngle);其中,st
14、artAngle为起始角度,sweepAngle为旋转度;(2)DrawPie方法,用于画一条弧线,并将弧的两个端点与圆心相连,即画出一个扇形轮廓,使用方法:DrawPie(Pen p,int x,int y,int width,int height,int startAngle,int sweepAngle);其中各参数的意义与DrawArc类似;(3)FillPie方法,使用指定画刷填充扇形,使用方法:FillPie(Brush b,int x,int y,int width,int height,int startAngle,sweepAngle);g.DrawArc(p,10,10,2
15、00,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 绘制多边形与折线Graphics对象提供了以下一些用于绘制多边形的方法:(1)DrawLines方法,绘制一系列的折线,各个折线点的坐标用Points数组指定,若最后的点不等于第一个点的坐标,那么图形不封闭,使用方法:DrawLines(Pen p,Point points);(2)DrawPolygon方法,绘制多边形,即使最后一个点和第一个点不相同,也绘
16、制封闭多边形,使用方法:DrawPolygon(Pen p,Point points);(3)FillPolygon方法,填充多边形,使用方法:FillPolygon(Brush b,Point points);Pen p=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.FillP
17、olygon(b,points);g.DrawPolygon(p,points);5、图像处理概述5.1 图像文件类型使用GDI+可以显示和处理多种格式的图像文件,其中主要包括:位图(*.bmp)Icon(*.ico)GIF(*.gif)JPEG(*.jpg)5.2 图像对象在.NET中,进行图像处理一般是通过Image类及其派生类来实现;Image类是一个抽象类,不能直接使用,实践中主要使用它的派生类Bitmap类;Bitmap类封装了GDI+位图,可以处理由像素数据定义的图像,该类属于System.Drawing名词空间;Bitmap类的构造函数:Bitmap(string filenam
18、e);Bitmap(Image img);Bitmap(Stream stream);Bitmap bm=new Bitmap(“test.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控件,要在该控件上显示图片,需设置其
19、Image属性,通过属性框或者程序运行时的OpenFileDialog对话框,可以指定Image属性;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类位于 里7
20、、图像拷贝和粘贴在C#中,Clipboard类提供了将数据放在系统剪贴板和从系统剪贴板恢复数据的方法,它位于名词空间System.Windows.Forms 里;Clipboard类只有三个成员:构造函数:SetDataObject:该静态方法实现往剪贴板上写数据,使用方式如下:Clipboard.SetDataObject(Object obj);GetDataObject:该静态方法负责从剪贴板中获取数据,它将返回IDataObject,可以使用IDataObject的GetDataPresent方法来判断当前数据是否是指定的数据,然后使用GetData方法获取指定格式的数据,如:IDat
21、aObject 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应用程序:
限制150内