您的位置:首页 > 编程语言 > C#

第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+,功能十分强大,能完成对图像的全方位处理.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: