C#_GDI+编程教程.doc

上传人:最*** 文档编号:1558996 上传时间:2019-10-27 格式:DOC 页数:39 大小:1.14MB
返回 下载 相关 举报
C#_GDI+编程教程.doc_第1页
第1页 / 共39页
C#_GDI+编程教程.doc_第2页
第2页 / 共39页
C#_GDI+编程教程.doc_第3页
第3页 / 共39页
点击查看更多>>
资源描述
_C#图形图像编程基础本次课程主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。1 GDI+绘图基础编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数。GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphice Device Interface Plus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。1.1 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的功能;第(二)修订了编程模型,使图形编程更加简易灵活。1.2 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对象Graphics类的方法成员有了一个Graphics的对象引用后,就可以利用该对象的成员进行各种各样图形的绘制,表7.1列出了Graphics类的常用方法成员。表7.1 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;1.3 常用画图对象在创建了Graphics对象后,就可以用它开始绘图了,可以画线、填充图形、显示文本等等,其中主要用到的对象还有:l Pen:用来用patterns、colors或者bitmaps进行填充。l Color:用来画线和多边形,包括矩形、圆和饼形。l Font:用来给文字设置字体格式。l Brush:用来描述颜色。l Rectangle:矩形结构通常用来在窗体上画矩形。l Point:描述一对有序的x,y两个坐标值。1Pen类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常用的属性有以下几个,如表7.2所示:表7.2 Pen常用属性名称说明Alignment获得或者设置画笔的对齐方式。Brush获得或者设置画笔的属性。Color获得或者设置画笔的颜色。Width获得或者设置画笔的宽度。2Color结构在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操作。Color结构的基本属性如表7.3所示。表7.3 颜色的基本属性名称说明A获取此Color结构的alpha分量值,取值(0255)。B获取此Color结构的蓝色分量值,取值(0255)。G获取此Color结构的绿色分量值,取值(0255)。R获取此Color结构的红色分量值,取值(0255)。Name获取此Color结构的名称,这将返回用户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的),对于自定义的颜色,将返回RGB值。Color结构的基本(静态)方法如表7.4所示表7.4 颜色的基本方法名称说明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)定义BitmapBitmap myBitmap = new Bitmap(c:MyImagesTestImage.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; 3Font类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);字体常用属性如表7.5所示。表7.5 字体的常用属性名称说明Bold是否为粗体。FontFamily字体成员。Height字体高。Italic是否为斜体。Name字体名称。Size字体尺寸。SizeInPoints获取此 Font对象的字号,以磅为单位。Strikeout是否有删除线。Style字体类型。Underline是否有下划线。Unit字体尺寸单位。4Brush类Brush类是一个抽象的基类,因此它不能被实例化,我们总是用它的派生类进行实例化一个画刷对象,当我们对图形内部进行填充操作时就会用到画刷,关于画刷在7.1.5中有详细讲解。5Rectangle结构存储一组整数,共四个,表示一个矩形的位置和大小。矩形结构通常用来在窗体上画矩形,除了利用它的构造函数构造矩形对象外,还可以使用Rectangle结构的属性成员,其属性成员如表7.6所示。表7.6 Rectangle结构属性名称说明Bottom底端坐标Height矩形高IsEmpty测试矩形宽和高是否为0Left矩形左边坐标Location矩形的位置Right矩形右边坐标Size矩形尺寸.Top矩形顶端坐标Width矩形宽X矩形左上角顶点X坐标Y矩形左上角顶点Y坐标Retangle结构的构造函数有以下两个:/用指定的位置和大小初始化Rectangle类的新实例。public Retangle(Point,Size);/Size结构存储一个有序整数对,通常为矩形的宽度和高度。和public Rectangle(int,int,int,int);6Point结构用指定坐标初始化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);71.4 基本图形绘制举例1画一个矩形【例1】建立一个项目,在窗体上画一个矩形,通过直接在Form1类中重载OnPaint函数的方法来实现。图1 画一个矩形protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Rectangle rect = new Rectangle(50, 30, 100, 100); LinearGradientBrush lBrush = new LinearGradientBrush(rect, Color.Red,Color.Yellow,LinearGradientMode.BackwardDiagonal); g.FillRectangle(lBrush, rect); 运行结果如图1所示。2画一个弧【例2】画一个弧形。弧形函数格式如下:public void DrawArc(Pen pen,Rectangle rect,Float startArgle,Float sweepAngle);直接在Form1类中重载OnPaint函数protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics ;Pen pn = new Pen( Color.Blue);Rectangle rect = new Rectangle(50, 50, 200,100);g.DrawArc(pn,rect,12,84);运行结果如图2所示。图2 画一个弧3画线【例3】画一条线。protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Pen pn = new Pen(Color.Blue); Point pt1 = new Point(30,30); Point pt2 = new Point(110,100); g.DrawLine(pn,pt1,pt2); 运行结果如图3所示。图3画一条线4画椭圆【例4】画一个椭圆。图4画一个椭圆protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics ; Pen pn = new Pen( Color.Blue, 100 ); Rectangle rect = new Rectangle(50, 50, 200, 100); g.DrawEllipse( pn, rect ); 运行结果如图4所示。5输出文本【例5】输出文本。protected override void OnPaint(PaintEventArgs e)Font fnt = new Font(Verdana, 16);Graphics g = e.Graphics;g.DrawString(GDI+ World, fnt, new SolidBrush(Color.Red), 14,10);运行结果如图5所示。图5 输出文本6填充路径【例6】填充路径。protected override void OnPaint(PaintEventArgs e) Graphics g = e.Graphics; g.FillRectangle(new SolidBrush(Color.White), ClientRectangle); GraphicsPath path = new GraphicsPath(new Point new Point(40, 140), new Point(275, 200), new Point(105, 225), new Point(190, 300), new Point(50, 350), new Point(20, 180), , new byte (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line, (byte)PathPointType.Line, ); PathGradientBrush pgb = new PathGradientBrush(path); pgb.SurroundColors = new Color Color.Green,Color.Yellow,Color.Red, Color.Blue,Color.Orange, Color.White, ;g.FillPath(pgb, path);运行结果如图6所示。图6 填充路径注意:GraphicsPath类位于命名空间System.Drawing.Drawing2D中,表示一系列相互连接的直线和曲线。1.5 画刷和画刷类型Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:HatchBrush、SolidBrush和TextureBrush等。画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间。1SolidBrush(单色画刷)它是一种一般的画刷,通常只用一种颜色去填充GDI+图形,例如:protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics;SolidBrush sdBrush1 = new SolidBrush(Color.Red);SolidBrush sdBrush2 = new SolidBrush(Color.Green);SolidBrush sdBrush3 = new SolidBrush(Color.Blue);g.FillEllipse(sdBrush2, 20, 40, 60, 70);Rectangle rect = new Rectangle(0, 0, 200, 100);g.FillPie(sdBrush3, 0, 0, 200, 40, 0.0f, 30.0f );PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f);PointF point3 = new PointF(150.0f, 40.0f);PointF point4 = new PointF(250.0f, 50.0f);PointF point5 = new PointF(300.0f, 100.0f);PointF curvePoints = point1, point2, point3, point4,point5 ;g.FillPolygon(sdBrush1, curvePoints);运行结果如图7所示。图7 SolidBrush应用2HatchBrush(阴影画刷)HatchBrush类位于System.Drawing.Drawing2D命名空间中。阴影画刷有两种颜色:前景色和背景色,以及6种阴影。前景色定义线条的颜色,背景色定各线条之间间隙的颜色。HatchBrush类有两个构造函数:l public HatchBrush(HatchStyle,Color forecolor);l public HatchBrush(HatchStyle,Color forecolor,Color backcolor);HatchStyle枚举值指定可用于HatchBrush对象的不同图案。HatchStyle的主要成员如表7所示。表7 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指定具有织物外观的阴影。下面代码显示了HatchBrush画刷的使用。protected override void OnPaint(PaintEventArgs e)Graphics g = e.Graphics;HatchBrush hBrush1 = new HatchBrush(HatchStyle.DiagonalCross, Color.Chocolate, Color.Red); HatchBrush hBrush2 = new HatchBrush(HatchStyle.DashedHorizontal, Color.Green, Color.Black); HatchBrush hBrush3 = new HatchBrush(HatchStyle.Weave, Color.BlueViolet, Color.Blue); g.FillEllipse(hBrush1, 20, 80, 60, 20); Rectangle rect = new Rectangle(0, 0, 200, 100); g.FillPie(hBrush3, 0, 0, 200, 40, 0.0f, 30.0f ); PointF point1 = new PointF(50.0f, 250.0f);PointF point2 = new PointF(100.0f, 25.0f); PointF point3 = new PointF(150.0f, 40.0f); PointF point4 = new PointF(250.0f, 50.0f); PointF point5 = new PointF(300.0f, 100.0f); PointF curvePoints = point1, point2, point3, point4, point5 ; g.FillPolygon(hBrush2, curvePoints); 运行结果如图8所示。图8 HatchBrush应用3TextureBrush(纹理画刷)纹理画刷拥有图案,并且通常使用它来填充封闭的图形。为了对它初始化,可以使用一个已经存在的别人设计好了的图案,或使用常用的设计程序设计的自己的图案,同时应该使图案存储为常用图形文件格式,如BMP格式文件。这里有一个设计好的位图,被存储为Papers.bmp文件。private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;/根据文件名创建原始大小的bitmap对象Bitmap bitmap = new Bitmap(D:mm.jpg);/将其缩放到当前窗体大小bitmap = new Bitmap(bitmap, this.ClientRectangle.Size);TextureBrush myBrush = new TextureBrush(bitmap);g.FillEllipse(myBrush, this.ClientRectangle);运行结果如图9所示。图9 TextTureBursh应用4LinearGradientBrush和PathGradientBrush(渐变画刷)渐变画刷类似与实心画刷,因为它也是基于颜色的,与实心画刷不同的是:渐变画刷使用两种颜色;它的主要特点是:在使用过程中,一种颜色在一端,而另外一种颜色在另一端,在中间,两种颜色融合产生过渡或衰减的效果。渐变画刷有两种:线性画刷和路径画刷(LinearGradientBrush和PathGradientBrush)。其中LinearGradientBrush可以显示线性渐变效果,而PathGradientBrush是路径渐变的可以显示比较具有弹性的渐变效果。(1)LinearGradientBrush类LinearGradientBrush类构造函数如下:public LinearGradientBrush(Point point1,Point point2,Color color1,Color color2)参数说明:point1:表示线性渐变起始点的Point结构。 point2:表示线性渐变终结点的Point结构。 color1:表示线性渐变起始色的Color结构。 color2:表示线性渐变结束色的Color结构。 代码如下:private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;LinearGradientBrush myBrush = new LinearGradientBrush(this.ClientRectangle, Color.White, Color.Blue, LinearGradientMode.Vertical);g.FillRectangle(myBrush, this.ClientRectangle);运行结果如图10所示。图10 LinearGradientBrush的应用(2)PathGradientBrush类PathGradientBrush类的构造函数如下:public PathGradientBrush (GraphicsPath path);参数说明:path:GraphicsPath,定义此PathGradientBrush填充的区域。例子代码如下:private void Form1_Paint(object sender, PaintEventArgs e)Graphics g = e.Graphics;Point centerPoint = new Point(150, 100);int R = 60;GraphicsPath path = new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R);PathGradientBrush brush = new PathGradientBrush(path); /指定路径中心点 brush.CenterPoint = centerPoint; /指定路径中心的颜色brush.CenterColor = Color.Red;/Color类型的数组指定与路径上每个顶点的颜色brush.SurroundColors = new Color Color.Plum ;g.FillEllipse(brush,centerPoint.X-R,centerPoint.Y-R,2*R,2* R);centerPoint = new Point(350, 100);R = 20;path = new GraphicsPath();path.AddEllipse(centerPoint.X-R,centerPoint.Y-R,2*R,2*R);path.AddEllipse(centerPoint.X-2*R,centerPoint.Y-2*R,4*R,4* R);path.AddEllipse(centerPoint.X-3*R,centerPoint.Y-3*R,6*R,6* R);brush = new PathGradientBrush(path);brush.CenterPoint = centerPoint;brush.CenterColor = Color.Red;brush.SurroundColors = new Color Color.Black, Color.Blue, Color.Green ;g.FillPath(brush, path);运行结果如图11所示。图11 PathGradientBrush应用2 C#图像处理基础本次课程主要介绍C#图像处理基础知识以及对图像的基本处理方法和技巧,主要包括图像的加载、变换和保存等操作。2.1 C#图像处理概述1图像文件的类型GDI+支持的图像格式有BMP、GIF、JPEG、EXIF、PNG、TIFF、ICON、WMF、EMF等,几乎涵盖了所有的常用图像格式,使用GDI+可以显示和处理多种格式的图像文件。2图像类GDI+提供了Image、Bitmap和Metafile等类用于图像处理,为用户进行图像格式的加载、变换和保存等操作提供了方便。(1)Image类Image类是为Bitmap和Metafile的类提供功能的抽象基类。(2)Metafile类定义图形图元文件,图元文件包含描述一系列图形操作的记录,这些操作可以被记录(构造)和被回放(显示)。(3)Bitmap类封装GDI+位图,此位图由图形图像及其属性的像素数据组成,Bitmap是用于处理由像素数据定义的图像的对象,它属于System.Drawing命名空间,该命名空间提供了对GDI+基本图形功能的访问。Bitmap类常用方法和属性如表8所示。表8 Bitmap常用属性和方法名称说明公共属性Height获取此Image对象的高度。RawFormat获取此Image对象的格式。Size获取此Image对象的宽度和高度。Width获取此Image对象的宽度。公共方法GetPixel获取此Bitmap中指定像素的颜色。MakeTransparent使默认的透明颜色对此Bitmap透明。RotateFlip旋转、翻转或者同事旋转和翻转Image对象。Save将Image对象以指定的格式保存到指定的Stream对象。SetPixel设置Bitmap对象中指定像素的颜色。SetPropertyItem将指定的属性项设置为指定的值。SetResolution设置此Bitmap的分辨率。Bitmap类有多种构造函数,因此可以通过多种形式建立Bitmap对象,例如:从指定的现有图像建立Bitmap对象Bitmap box1 =new Bitmap(pictureBox1.Image);从指定的图像文件建立Bitmap对象,其中“C:MyImagesTestImage.bmp”已存在的图像文件Bitmap box2 =new Bitmap(C:MyImagesTestImage.bmp);从现有的Bitmap对象建立新的Bitmap对象Bitmap box3 = new Bitmap(box1);2.2 图像的输入和保存1图像的输入在窗体或图形框内输入图像有两种方式:(一)在窗体设计时使用图形框对象的Image属性输入;(二)在程序中通过打开文件对话框输入。方法(一)、窗体设计时使用图形框对象的Image属性输入窗体设计时使用对象的Image属性输入图像的操作如下:(1)在窗体上,建立一个图形框对象(pictureBox1),选择图形框对象属性中的Image属性,如图12所示。(2)单击Image属性右侧的【】,弹出一个“选择资源”窗口,在该窗口中选择“本地资源”,单击【导入(M).】将弹出一个“打开”对话框,如图13所示。图12 Image属性图13“打开”对话框(3)选择图像文件后,单击【打开】按钮。方法(二)、使用“打开文件”对话框输入图像在窗体上添加一个命令按钮(button1)和一个图形框对象(pictureBox1),双击命令按钮,在响应方法中输入如下代码:private void button1_Click(object sender, EventArgs e) OpenFileDialog ofdlg = new OpenFileDialog(); ofdlg.Filter = BMP File(*.bmp)|*.bmp; if (ofdlg.ShowDialog() = DialogResult.OK) Bitmap image = new Bitmap(ofdlg.FileName); pictureBox1.Image = image; 执行该程序时,使用“打开文件”对话框,选择图像文件,该图像将会被打开,并显示在pictureBox1图像框中。【例7】图像输入。采用方法(二)来实现图像的输入。设计步骤如下:(1)建立如图14所示的项目界面,在窗体上加入【打开图像】命令按钮和一个PictureBox控件。(2)双击【打开图像】命令按钮,编辑按钮的单击事件响应函数,其代码同方法(二)中所写代码,在此不再重复。图14 图像输入(3)运行后单击【打开图像】按钮,弹出一个“打开文件”对话框,选择图象文件名,运行结果如图15所示。图15 运行结果2图像的保存保存图像的步骤如下:(1)当使用按钮和保存对话框保存文件时,加入保存按钮和PictureBox控件,窗体设计如图16所示。(2)保存命令钮的单击事件的响应函数代码如下:private void button2_Click(object sender, EventArgs e) string str; Bitmap box1 = new Bitmap(pictureBox1.Image); SaveFileDialog sfdlg = new SaveFileDialog(); sfdlg.Filter = bmp文件(*.BMP)|*.BMP|All File(*.*)|*.*; sfdlg.ShowDialog(); str = sfdlg.FileName; box1.Save(str); 执行该过程时,将打开“另存为”对话框,如图17所示。图16 保存图像图17 “另存为”对话框选择图像文件的保存路径。3图像格式的转换使用Bitmap对象的Save方法,可以把打开的图像保存为不同的文件格式,从而实现图像格式的转换。在上述例子中添加一个命令按钮,双击该命令按钮,编辑其相应代码如下:private void button3_Click(object sender, EventArgs e)string str; Bitmap box1 = new Bitmap(pictureBox1.Image); SaveFileDialog sfdlg = new SaveFileDialog(); sfdlg.Filter = bmp文件(*.jpeg)|*.jpeg|All File(*.*)|*.*; sfdlg.ShowDialog(); str = sfdlg.FileName;box1.Save(str,System.Drawing.Imaging.ImageFormat.Jpeg);Bitmap对象的Save方法中的第二个参数指定了图像保存的格式。Imaging.ImageFormat支持的格式如表9所示:表9 Imaging.ImageFormat支持的格式名称说明 Bmp获取位图图像格式(BMP)。Emf获取增强型Windows图元文件图像格式(EMF)。Exif获取可交换图像文件(Exif)格式。 Gif获取图形交换格式(GIF)图像格式。 Guid获取表示此ImageForma 对象的Guid结构。Icon获取Windows图标图像格式。Jpeg获取联合图像专家组(JPEG)图像格式。MemoryBmp获取内存位图图像格式。Png获取W3C可移植网络图形(PNG)图像格式。Tiff获取标签图像文件格式(TIFF)图像格式。Wmf获取Windows图元文件(WMF)图像格式。2.3 图像的拷贝和粘贴图像拷贝和粘贴是图像处理的基本操作之一,通常有两种方法来完成图像的拷贝和粘贴:一种可以使用剪贴板拷贝和粘贴图像,一种使用AxPictureClip控件拷贝和粘贴图像。1使用剪贴板拷贝和粘贴图像剪贴板是在Windwos系统中单独预留出来的一块内存,它用来暂时存放在Windwos应用程序间要交换的数据,使用剪贴板对象可以轻松实现应用程序间的数据交换,这些数据包括图像或文本。在C#中,剪贴板通过Clipboard类来实现,Clipboard类的常用方法如表10所示。表10 Clipboard类常用方法名称说明Clear从剪贴板中移除所有数据。ContainsData指示剪贴板中是否存在指定格式的数据,或可转换成此格式的数据。ContainsImage指示剪贴板中是否存在 Bitmap 格式或可转换成此格式的数据。ContainsText已重载。指示剪贴板中是否存在文本数据。GetData从剪贴板中检索指定格式的数据。GetDataObject检索当前位于系统剪贴板中的数据。GetFileDropList从剪贴板中检索文件名的集合。GetImage检索剪贴板上的图像。GetText已重载。从剪贴板中检索文本数据。SetAudio已重载。将WaveAudio格式的数据添加到剪贴板中。SetData将指定格式的数据添加到剪贴板中。SetDataObject已重载。将数据置于系统剪贴板中。SetImage将Bitmap格式的Image添加到剪贴板中。SetText已重载。将文本数据添加到剪贴板中。剪贴板的使用主要有一下两个步骤:l 将数据置于剪贴板中。l 从剪贴板中检索数据。下面简要介绍剪贴板的使用。(1)将数据置于剪贴板中可以通过SetDataObject方法将数据置于剪贴板中,SetDataObject方法有以下三种形式的定义:l Clipboard.SetDataObject(Object):将非持久性数据置于系统剪贴板中。由.NET Compact Framework支持。l Clipboard.SetDataObject(Object,Boolean):将数据置于系统剪贴板中,并指定在退出应用程序后是否将数据保留在剪贴板中。l Clboard.SetDataObject(Object,Boolean,Int32,Int32):尝试指定的次数,以将数据置于系统剪贴板中,且两次尝试之间具有指定的延迟,可以选择在退出应用程序后将数据保留在剪贴板中。将字符串置于剪贴板中的语句如下所示:string str = Mahesh writing data to the Clipboard;Clipboard.SetDataObject(str)(2)从剪贴板中检索数据可以通过GetDataObject方法从剪贴板中检索数据,它将返回IdataObject,其定义如下:public static IDataObject GetDataObject();首先使用IdataObject对象的GetDataPresent方法检测剪贴板上存放的是什么类型的数据,然后是使用IdataObject对象的GetData方法获取剪贴板上相应的数据类型的数据。下面使用GetDataObject方法从剪贴板中检索出字符串数据。例如:IDataObject iData = Clipboard.GetDataObject(); if (iData.GetDataPresent(DataFormats.Text) string str =(String)iData.GetData(DataFormats.Text); 【例8】使用剪贴板拷贝和粘贴图像。(1)建立如图18所示的窗体。在窗体上天加两个图片框控件和两个命令按钮控件。利用第一个图片框的属性窗口为其输入图像。(2)双击【复制】命令按钮,输入如下代码,将图像置于剪贴板中。private void button1_Click(object sender, EventArgs e) Clipboard.SetDataObject(pictureBox1.Image); (3)双击【粘
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!