第7章 C#图形图像编程基础
2009-11-02 17:20
399 查看
第7章 C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础,C#图像处理基础以及简单的图像处理技术. 7.1 GDI+绘图基础 7.2 C#图像处理基础 7.1 GDI+绘图基础 编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数.GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(Graphics Device Interface Plus)版本,GDI+是GDI的进一步扩展,它使编程更加方便. 7.1.1 GDI+概述 GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的"托管类接口",GDI+主要提供了以下三类服务:(1)二维矢量图形:GDI+提供了存储图形基元自身信息的类(或结构体),存储图形基元绘制方式信息的类以及实际进行绘制的类. (2)图像处理:大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理.因此,GDI+为我们提供了Bitmap,Image等类,它们可用于显示,操作和保存BMP,JPG,GIF等图像格式. (3)文字显示:GDI+支持使用各种字体,字号和样式来显示文本. 7.1.2 Graphics类 Graphics类封装了一个GDI+绘图图面,提供将对象绘制到显示到设备的方法. 绘图程序的一般步骤: (1)创建Graphics对象 (2)使用Graphics对象的方法绘图,显示文本或处理图像. 通常用三种方法创建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; } 方法二 调用控件或窗体的CreateGraphics方法. 例如: Graphics g = this.CreateGraphics(); 注意:此时以this所代表的窗体为画布,也可以使用其他控件对象的引用,创建以控件对象为画布的Graphics对象. 方法三 //建立Image对象,名为"g1.jpg"的图片位于当前路径下 Image img = Image.FromFile("g1.jpg"); //创建Graphics对象 Graphics g = Graphics.FromImage(img); 注意:此时以文件"g1.jpg"为画布,使用g进行绘制图形时,其图形是绘制在文件"g1.jpg" 上的. 7.1.3 常用画图对象 在创建了Graphics对象后,就可以用它开始绘图了,可以画线,填充图形,显示文本等等,其中主要用到的对象还有: Pen:定义用于绘制直线和曲线的对象. Color:表示 ARGB 颜色. Font:定义特定的文本格式,包括字体,字号和字形属性. Brush:定义用于填充图形形状(如矩形,椭圆,饼形,多边形和封闭路径)的内部的对象. Rectangle:存储一组整数,共四个,表示一个矩形的位置和大小 . Point:表示在二维平面中定义点的,整数 X 和 Y 坐标的有序对 . 注意:各个对象的构造函数. Color对象 在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成.在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操作. Color red = Color.FromArgb(255, 0, 0); Color red = Color.FromArgb(120, 255, 0, 0)); 7.1.4 基本图形绘制举例 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); } 7.1.4 基本图形绘制举例 2.画一个弧 protected override void OnPaint(PaintEventArgs e) { Graphics g=e.Graphics; Pen pn=new Pen(Color.Blue); Rectangle rect=new Rectangle(0,0,100,100); g.DrawArc(pn,rect,12,84); } 7.1.4 基本图形绘制举例 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); } 7.1.4 基本图形绘制举例 4.画椭圆 protected override void OnPaint(PaintEventArgs e) { Graphics g=e.Graphics; Pen pn=new Pen(Color.Blue,1); Rectangle rect=new Rectangle(30,30,100,50); g.DrawEllipse(pn,rect); } 7.1.4 基本图形绘制举例 5.输出文本 protected override void OnPaint(PaintEventArgs e) { Font fnt=new Font("Verdana",16); Graphics g=e.Graphics; Pen pn=new Pen(Color.Blue,1); g.DrawString("GDI+World",fnt,new SolidBrush(Color.Red),50,50); } 7.1.4 基本图形绘制举例 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,40),new Point(275,100),new Point(105,125),new Point(190,200),new Point(50,250),new Point(20,80)}, 7.1.4 基本图形绘制举例 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); } 7.1.5 画刷和画刷类型 Brush类型是一个抽象类,所以它不能被实例化,也就是不能直接应用,但是我们可以利用它的派生类,如:HatchBrush,SolidBrush和TextureBrush等.画刷类型一般在System.Drawing命名空间中,如果应用HatchBrush和GradientBrush画刷,需要在程序中引入System.Drawing.Drawing2D命名空间. 画刷和画刷应用举例 1.SolidBrush(单色画刷) 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,150.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(200.0f,100.0f); PointF[] curvePoints={point1 ,point2,point3,point4,point5}; g.FillPolygon(sdBrush1,curvePoints);//填充多边形 } 画刷和画刷应用举例 2.HatchBrush(阴影画刷) protected override void OnPaint(PaintEventArgs e) { Graphics g=e.Graphics; HatchBrush hBrush1=new HatchBrush(HatchStyle.DiagonalCross,Color.Chocolate,Color.Lime); g.FillEllipse(hBrush1,20,20,150,150); } 画刷和画刷应用举例 3.TextureBrush(纹理画刷) private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Bitmap bitmap = new Bitmap("D://mn.jpg"); bitmap = new Bitmap(bitmap, this.ClientRectangle.Size); TextureBrush myBrush = new TextureBrush(bitmap); g.FillEllipse(myBrush, this.ClientRectangle); } 画刷和画刷应用举例 4.LinearGradientBrush和PathGradientBrush(渐变画刷) private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; LinearGradientBrush myBrush = new LinearGradientBrush(this.ClientRectangle, Color.Red, Color.White, LinearGradientMode.Vertical); g.FillRectangle(myBrush, this.ClientRectangle); } 画刷和画刷应用举例 4.LinearGradientBrush和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; 画刷和画刷应用举例 4.LinearGradientBrush和PathGradientBrush(渐变画刷) 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); 画刷和画刷应用举例 4.LinearGradientBrush和PathGradientBrush(渐变画刷) 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); } 7.2 C#图像处理基础 本节主要介绍C#图像处理基础知识以及对图像的基本处理方法和技巧,主要包括图像的加载,变换和保存等操作. 7.2.1 C#图像处理概述 7.2.2 图像的输入和保存 7.2.3 图像的拷贝和粘贴 7.2.4 彩色图像处理 7.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是用于处理由像素数据定义的图像的对象, 7.2.2 图像的输入和保存 1.图像的输入 在窗体或图形框内输入图像有两种方式: (一)在窗体设计时使用图形框对象的Image属性输入; (二)在程序中通过打开文件对话框输入. 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; } } 7.2.2 图像的输入和保存 2.图像的保存 box1.Save(strFileName); 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); } 7.2.2 图像的输入和保存 3.图像格式的转换 sfdlg.Filter = "jpg 文件(*.jpg)|*.jpg|ALL File(*.*)|*.*"; box1.Save(strFileName,System.Drawing.Imaging.ImageFormat.Jpeg); 7.2.3 图像的拷贝和粘贴 图像拷贝和粘贴是图像处理的基本操作之一,通常有两种方法来完成图像的拷贝和粘贴:一种可以使用剪贴板拷贝和粘贴图像,一种使用AxPictureClip控件拷贝和粘贴图像. 1.使用剪贴板拷贝和粘贴图像 【例7.8】使用剪贴板拷贝和粘贴图像. 注意:剪贴板的使用步骤. 2.使用AxPictureClip控件拷贝和粘贴图像 【例7.9】使用AxPictureClip控件剪切和粘贴图像. 注意:在C#中第三方COM组件的使用方法. 7.2.4 彩色图像处理 1.图像的分辨率 2.彩色图像变换灰度图像 3.灰度图像处理 1.图像的分辨率 所谓分辨率就是指画面的解析度,由多少像素构成,数值越大,图像也就越清晰.我们通常所看到的分辨率都以乘法形式表现的,例如800*600,其中"800"表示屏幕上水平方向显示的点数,"600"表示垂直方向的点数.图像分辨率越大,越能表现更丰富的细节.图像的分辨率决定了图像与原物的逼进程度,对同一大小的图像,其像素数越多,即将图像分割的越细,图像越清晰,称之为分辨率高,反之为分辨率低,分辨率的高低取决于采样操作.例如,对于一幅256*256分辨率的图像,采用变换的方法可以实现不同分辨率显示. 【例7.10】将256*256分辨率的图像变换为64*64分辨率. 2.彩色图像变换灰度图像 算法说明:将彩色图像像素的颜色值分解为三基色R,G,B,求其和的平均值,然后使用SetPixel方法以该平均值参数生成图像. 【例7.11】彩色图像生成灰度图像. 3.灰度图像处理 算法说明:本例根据特定的输入输出灰度转换关系,增强了图像灰度,处理后图像的中等灰度值增大,图像变亮. 注意:本例中描述对比度改善的输入,输出灰度值对应关系的程序段为: 略... 【例7.12】改善对比度. 本章小结 本章主要讲述了C#下的图形图像基础知识,对图形的绘制,图像的处理和音频视频等多媒体的使用方法;在图片处理方面.NET提供了一个GDI+,功能十分强大,能完成对图像的全方位处理.
相关文章推荐
- 图形与图像编程(二)-基础图像技术
- C#.net 地图控件开发(三) GDI+图形图像编程基础1.
- C#.net 地图控件开发(四) GDI+图形图像编程基础2.
- OpenGL基础图形编程 - 位图和图像
- C#—图形图像编程基础
- android图形图像编程-第一章 基础概念和数据结构
- OpenGL基础图形编程 - 位图和图像
- C#.net 地图控件开发(五) GDI+图形图像编程基础3.
- PS之图形图像基础
- [转]超全面的.NET GDI+图形图像编程教程
- 13:图像模糊处理(1.8编程基础之多维数组)
- OpenGL基础图形编程 - OpenGL变换
- OpenGL基础图形编程 - 特殊光处理
- MFC 图形编程基础——映射模式和坐标变换
- OpenCV作图像处理和识别方面的编程时常用的基础语句积累!
- 《Programming WPF》翻译 第7章 1.图形基础
- 深入浅出认识图形图像编程
- VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
- 图像处理基础-----图形图像两兄弟
- 图形图像基础 (-)