C#GDI+编程教程.docx

上传人:b****5 文档编号:5573012 上传时间:2022-12-27 格式:DOCX 页数:21 大小:24.31KB
下载 相关 举报
C#GDI+编程教程.docx_第1页
第1页 / 共21页
C#GDI+编程教程.docx_第2页
第2页 / 共21页
C#GDI+编程教程.docx_第3页
第3页 / 共21页
C#GDI+编程教程.docx_第4页
第4页 / 共21页
C#GDI+编程教程.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

C#GDI+编程教程.docx

《C#GDI+编程教程.docx》由会员分享,可在线阅读,更多相关《C#GDI+编程教程.docx(21页珍藏版)》请在冰豆网上搜索。

C#GDI+编程教程.docx

C#GDI+编程教程

C#图形图像编程基础

本次课程主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础、C#图像处理基础以及简单的图像处理技术。

1GDI+绘图基础

编写图形程序时需要使用GDI(GraphicsDeviceInterface,图形设备接口),从程序设计的角度看,GDI包括两部分:

一部分是GDI对象,另一部分是GDI函数。

GDI对象定义了GDI函数使用的工具和环境变量,而GDI函数使用GDI对象绘制各种图形,在C#中,进行图形程序编写时用到的是GDI+(GraphiceDeviceInterfacePlus图形设备接口)版本,GDI+是GDI的进一步扩展,它使我们编程更加方便。

GDI+概述

GDI+是微软在Windows2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的“托管类接口”,GDI+主要提供了以下三类服务:

(1)二维矢量图形:

GDI+提供了存储图形基元自身信息的类(或结构体)、存储图形基元绘制方式信息的类以及实际进行绘制的类。

(2)图像处理:

大多数图片都难以划定为直线和曲线的集合,无法使用二维矢量图形方式进行处理。

因此,GDI+为我们提供了Bitmap、Image等类,它们可用于显示、操作和保存BMP、JPG、GIF等图像格式。

(3)文字显示:

GDI+支持使用各种字体、字号和样式来显示文本。

我们要进行图形编程,就必须先讲解Graphics类,同时我们还必须掌握Pen、Brush和Rectangle这几种类。

GDI+比GDI优越主要表现在两个方面:

(一)GDI+通过提供新功能(例如:

渐变画笔和alpha混合)扩展了GDI的功能;第

(二)修订了编程模型,使图形编程更加简易灵活。

Graphics类

Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联。

画图方法都被包括在Graphics类中,在画任何对象(例如:

Circle,Rectangle)时,我们首先要创建一个Graphics类实例,这个实例相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。

绘图程序的设计过程一般分为两个步骤:

(一)创建Graphics对象;

(二)使用Graphics对象的方法绘图、显示文本或处理图像。

通常我们使用下述三种方法来创建一个Graphics对象。

方法一、利用控件或窗体的Paint事件中的PainEventArgs

在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用的Graphics)的一部分,在为控件创建绘制代码时,通常会使用此方法来获取对图形对象的引用。

例如:

ET中,GDI+的所有绘图功能都包括在System、、

2.引用命名空间

在C#应用程序中使用using命令已用给定的命名空间或类,下面是一个C#应用程序引用命名空间的例子:

usingSystem;

using;

using;

using;

常用画图对象

在创建了Graphics对象后,就可以用它开始绘图了,可以画线、填充图形、显示文本等等,其中主要用到的对象还有:

●Pen:

用来用patterns、colors或者bitmaps进行填充。

●Color:

用来画线和多边形,包括矩形、圆和饼形。

●Font:

用来给文字设置字体格式。

●Brush:

用来描述颜色。

●Rectangle:

矩形结构通常用来在窗体上画矩形。

●Point:

描述一对有序的x,y两个坐标值。

1.Pen类

Pen用来绘制指定宽度和样式的直线。

使用DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理。

使用画笔时,需要先实例化一个画笔对象,主要有以下几种方法。

用指定的颜色实例化一只画笔的方法如下:

publicPen(Color);

用指定的画刷实例化一只画笔的方法如下:

publicPen(Brush);

用指定的画刷和宽度实例化一只画笔的方法如下:

publicPen(Brush,float);

用指定的颜色和宽度实例化一只画笔的方法如下:

publicPen(Color,float);

实例化画笔的语句格式如下:

Penpn=newPen;

或者Penpn=newPen,100);

Pen常用的属性有以下几个,如表所示:

表Pen常用属性

名称

说明

Alignment

获得或者设置画笔的对齐方式。

Brush

获得或者设置画笔的属性。

Color

获得或者设置画笔的颜色。

Width

获得或者设置画笔的宽度。

2.Color结构

在自然界中,颜色大都由透明度(A)和三基色(R,G,B)所组成。

在GDI+中,通过Color结构封装对颜色的定义,Color结构中,除了提供(A,R,G,B)以外,还提供许多系统定义的颜色,如Pink(粉颜色),另外,还提供许多静态成员,用于对颜色进行操作。

Color结构的基本属性如表所示。

表颜色的基本属性

名称

说明

A

获取此Color结构的alpha分量值,取值(0~255)。

B

获取此Color结构的蓝色分量值,取值(0~255)。

G

获取此Color结构的绿色分量值,取值(0~255)。

R

获取此Color结构的红色分量值,取值(0~255)。

Name

获取此Color结构的名称,这将返回用户定义的颜色的名称或已知颜色的名称(如果该颜色是从某个名称创建的),对于自定义的颜色,将返回RGB值。

Color结构的基本(静态)方法如表所示

表颜色的基本方法

名称

说明

FromArgb

从四个8位ARGB分量(alpha、红色、绿色和蓝色)值创建Color结构。

FromKnowColor

从指定的预定义颜色创建一个Color结构。

FromName

从预定义颜色的指定名称创建一个Color结构。

Color结构变量可以通过已有颜色构造,也可以通过RGB建立,例如:

Colorclr1=(122,25,255);

Colorclr2=;

Top

矩形顶端坐标

Width

矩形宽

X

矩形左上角顶点X坐标

Y

矩形左上角顶点Y坐标

Retangle结构的构造函数有以下两个:

.】将弹出一个“打开”对话框,如图13所示。

图12Image属性

图13“打开”对话框

(3)选择图像文件后,单击【打开】按钮。

方法

(二)、使用“打开文件”对话框输入图像

在窗体上添加一个命令按钮(button1)和一个图形框对象(pictureBox1),双击命令按钮,在响应方法中输入如下代码:

privatevoidbutton1_Click(objectsender,EventArgse)

{

OpenFileDialogofdlg=newOpenFileDialog();

="BMPFile(*.bmp)|*.bmp";

if()==

{

Bitmapimage=newBitmap;

=image;

}

}

执行该程序时,使用“打开文件”对话框,选择图像文件,该图像将会被打开,并显示在pictureBox1图像框中。

【例7】图像输入。

采用方法

(二)来实现图像的输入。

设计步骤如下:

(1)建立如图14所示的项目界面,在窗体上加入【打开图像】命令按钮和一个PictureBox控件。

(2)双击【打开图像】命令按钮,编辑按钮的单击事件响应函数,其代码同方法

(二)中所写代码,在此不再重复。

图14图像输入

(3)运行后单击【打开图像】按钮,弹出一个“打开文件”对话框,选择图象文件名,运行结果如图15所示。

图15运行结果

2.图像的保存

保存图像的步骤如下:

(1)当使用按钮和保存对话框保存文件时,加入保存按钮和PictureBox控件,窗体设计如图16所示。

(2)保存命令钮的单击事件的响应函数代码如下:

privatevoidbutton2_Click(objectsender,EventArgse)

{

stringstr;

Bitmapbox1=newBitmap;

SaveFileDialogsfdlg=newSaveFileDialog();

="bmp文件(*.BMP)|*.BMP|AllFile(*.*)|*.*";

();

str=;

(str);

}

执行该过程时,将打开“另存为”对话框,如图17所示。

图16保存图像

图17“另存为”对话框

选择图像文件的保存路径。

3.图像格式的转换

使用Bitmap对象的Save方法,可以把打开的图像保存为不同的文件格式,从而实现图像格式的转换。

在上述例子中添加一个命令按钮,双击该命令按钮,编辑其相应代码如下:

privatevoidbutton3_Click(objectsender,EventArgse)

{

stringstr;

Bitmapbox1=newBitmap;

SaveFileDialogsfdlg=newSaveFileDialog();

="bmp文件(*.jpeg)|*.jpeg|AllFile(*.*)|*.*";

();

str=;

}

Bitmap对象的Save方法中的第二个参数指定了图像保存的格式。

支持的格式如表9所示:

表9支持的格式

名称

说明

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)图像格式。

图像的拷贝和粘贴

图像拷贝和粘贴是图像处理的基本操作之一,通常有两种方法来完成图像的拷贝和粘贴:

一种可以使用剪贴板拷贝和粘贴图像,一种使用AxPictureClip控件拷贝和粘贴图像。

1.使用剪贴板拷贝和粘贴图像

剪贴板是在Windwos系统中单独预留出来的一块内存,它用来暂时存放在Windwos应用程序间要交换的数据,使用剪贴板对象可以轻松实现应用程序间的数据交换,这些数据包括图像或文本。

在C#中,剪贴板通过Clipboard类来实现,Clipboard类的常用方法如表10所示。

表10Clipboard类常用方法

名称

说明

Clear

从剪贴板中移除所有数据。

ContainsData

指示剪贴板中是否存在指定格式的数据,或可转换成此格式的数据。

ContainsImage

指示剪贴板中是否存在Bitmap格式或可转换成此格式的数据。

ContainsText

已重载。

指示剪贴板中是否存在文本数据。

GetData

从剪贴板中检索指定格式的数据。

GetDataObject

检索当前位于系统剪贴板中的数据。

GetFileDropList

从剪贴板中检索文件名的集合。

GetImage

检索剪贴板上的图像。

GetText

已重载。

从剪贴板中检索文本数据。

SetAudio

已重载。

将WaveAudio格式的数据添加到剪贴板中。

SetData

将指定格式的数据添加到剪贴板中。

SetDataObject

已重载。

将数据置于系统剪贴板中。

SetImage

将Bitmap格式的Image添加到剪贴板中。

SetText

已重载。

将文本数据添加到剪贴板中。

剪贴板的使用主要有一下两个步骤:

●将数据置于剪贴板中。

●从剪贴板中检索数据。

下面简要介绍剪贴板的使用。

(1)将数据置于剪贴板中

可以通过SetDataObject方法将数据置于剪贴板中,SetDataObject方法有以下三种形式的定义:

●(Object):

将非持久性数据置于系统剪贴板中。

由.NETCompactFramework支持。

●(Object,Boolean):

将数据置于系统剪贴板中,并指定在退出应用程序后是否将数据保留在剪贴板中。

●(Object,Boolean,Int32,Int32):

尝试指定的次数,以将数据置于系统剪贴板中,且两次尝试之间具有指定的延迟,可以选择在退出应用程序后将数据保留在剪贴板中。

将字符串置于剪贴板中的语句如下所示:

stringstr="MaheshwritingdatatotheClipboard";

(str)

(2)从剪贴板中检索数据

可以通过GetDataObject方法从剪贴板中检索数据,它将返回IdataObject,其定义如下:

publicstaticIDataObjectGetDataObject();

首先使用IdataObject对象的GetDataPresent方法检测剪贴板上存放的是什么类型的数据,然后是使用IdataObject对象的GetData方法获取剪贴板上相应的数据类型的数据。

下面使用GetDataObject方法从剪贴板中检索出字符串数据。

例如:

IDataObjectiData=();

if)

{

stringstr=(String);

}

【例8】使用剪贴板拷贝和粘贴图像。

(1)建立如图18所示的窗体。

在窗体上天加两个图片框控件和两个命令按钮控件。

利用第一个图片框的属性窗口为其输入图像。

(2)双击【复制】命令按钮,输入如下代码,将图像置于剪贴板中。

privatevoidbutton1_Click(objectsender,EventArgse)

{

;

}

(3)双击【粘贴】命令按钮,输入如下代码,从剪贴板中检索出图像,并显示于第二个图片框中。

privatevoidbutton2_Click(objectsender,EventArgse)

{

IDataObjectiData=();

if)

{

=(Bitmap)

;

}

}

(4)运行程序,首先单击【复制】命令按钮,然后单击【粘贴】命令按钮,运行结果如图19所示。

图18剪贴板窗体设计

图19剪贴板图像复制

2.使用AxPictureClip控件拷贝和粘贴图像

AxPictureClip控件不是常规控件,而是一个ActiveX控件。

因此,工具箱中没有该控件,要想使用该控件,必须把该控件添加到工具箱中,具体步骤如下:

(1)右键单击工具箱的空白处,在弹出的快捷菜单中选择【选择项】菜单项,则弹出“选择工具箱项”对话框,如图20所示。

图20添加AxPictureClip控件

(2)在该对话框中的【COM组件】选项卡中选择【MicrosoftPictureClipControl,version6】项,并单击【确定】按钮,该控件就添加到工具箱中了。

AxPictureClip控件可用于随机访问方法或者枚举访问方法指定源位图中剪切区域如下:

●使用随机访问方法来作为剪切区域选择源位图的任何部分。

通过使用ClipX和ClipY属性指定的剪切区域左上角,ClipHeight和ClipWidth属性确定剪切区域的区域。

当想要查看位图的一部分此方法很有用。

●使用枚举访问方法可以分成的行和列数指定源位图。

结果是图片的统一矩阵单元编号0、1、2和等等,通过使用GraphicCell属性来访问单个单元。

当源位图图像与要访问单独的调色板包含这种方法非常有用。

【例9】使用AxPictureClip控件剪切和粘贴图像。

(1)建立如图21示的窗体。

在窗体上天加两个图片框控件和两个命令按钮控件。

(2)双击【打开】命令按钮,输入如下代码,将图像打开。

privatevoidbutton1_Click(objectsender,EventArgse)

{

OpenFileDialogofdlg=newOpenFileDialog();

="BMPFile(*.bmp)|*.bmp";

if()==

{

Bitmapimage=newBitmap;

=image;

}

}

(3)双击【复制与粘贴】命令按钮,输入如下代码,将图像复制到第二个图片框中。

privatevoidbutton2_Click(objectsender,EventArgse)

{

//使用枚举访问方法

=;

=6;//将图片分成6列

=3;//将图片分成3行

try

{

=(0);//取出第一个图像块

}

catch(Exceptionex)

{

());

}

}

(4)运行程序,单击【打开】命令按钮,选择一个图像文件打开,如图21所示,然后单击【复制与粘贴】命令按钮,运行结果如图22所示。

图21打开图片后效果

(5)使用随机访问方法。

也可以使用随机访问方法,只需将上述例子中的【复制与粘贴】命令按钮的响应方法改为如下代码即可:

privatevoidbutton2_Click(objectsender,EventArgse)

{

//使用随机访问方法

=;

=15;

=15;

=50;

=50;

=;//

}

图22粘贴后效果

注意:

如果没有控件,需要自行下载或复制到本机,并通过注册程序REGSVR32注册该组件。

例如,如果该文件在C:

\WINDOWS\system32\路径下,可以通过如下命令行语句实现注册:

REGSVR32C:

\WINDOWS\system32\

彩色图像处理

1.图像的分辨率

所谓分辨率就是指画面的解析度,由多少像素构成,数值越大,图像也就越清晰。

我们通常所看到的分辨率都以乘法形式表现的,例如800*600,其中“800”表示屏幕上水平方向显示的点数,“600”表示垂直方向的点数。

图像分辨率越大,越能表现更丰富的细节。

图像的分辨率决定了图像与原物的逼进程度,对同一大小的图像,其像素数越多,即将图像分割的越细,图像越清晰,称之为分辨率高,反之为分辨率低,分辨率的高低取决于采样操作。

例如,对于一幅256*256分辨率的图像,采用变换的方法可以实现不同分辨率显示。

【例10】将256*256分辨率的图像变换为64*64分辨率。

算法说明:

将256*256分辨率的图像变换为64*64分辨率方法是将源图像分成4*4的子图像块,然后将该4*4子图像块的所有像素的颜色按F(i,j)的颜色值进行设定,达到降低分辨率的目的。

建立一个如图23所示界面的项目,【分辨率】命令按钮的响应方法的代码设计如下:

privatevoidbutton3_Click(objectsender,EventArgse)

{

Colorc=newColor();

//把图片框中的图片给一个Bitmap类型

Bitmapbox1=newBitmap;

Bitmapbox2=newBitmap;

intr,g,b,size,k1,k2,xres,yres,i,j;

size=4;

for(i=0;i<=xres-1;i+=size)

{

for(j=0;j<=yres-1;j+=size)

{

c=(i,j);

r=;

g=;

b=;

//用FromArgb把整型转换成颜色值

Colorcc=(r,g,b);

for(k1=0;k1<=size-1;k1++)

{

for(k2=0;k2<=size-1;k2++)

{

(i+k1,j+k2,cc);

}

}

}

}

();//刷新

=box2;//图片赋到图片框中

}

输入图像分辨率为256*256像素,转换为64*64分辨率图像如图23所示。

图23分辨率

2.彩色图像变换灰度图像

(1)彩色位图图像的颜色

图像像素的颜色是由三种基本色颜色,即红(R)、绿(G)、蓝(B)有机组合而成的,称为三基色。

每种基色可取0~255的值,因此由三基色可组合成(256*256*256)1677万种颜色,每种颜色都有其对应的R、G、B值。

例如,常见的7种颜色及其对应的R、G、B值如表11所示。

表11常见的7种颜色及其对应的R、G、B值

颜色名

R值

G值

B值

255

0

0

0

0

255

绿

0

255

0

255

255

255

255

255

0

0

0

0

0

255

255

品红

255

0

255

(2)彩色图像颜色值的获取

在使用C#系统处理彩色图像时,使用Bitmap类的GetPixel方法获取图像上指定像素的颜色值,格式为:

Colorc=newColor();

c=(i,j);

其中,(i,j)为获得颜色的坐标位置。

GetPixel方法取得指定位置的颜色值并返回一个长整型的整数。

例如,求图片框1中图像在位置(i,j)的像素颜色值c时,可写为:

Colorc=newColor();

c=(i,j);

(3)彩色位图颜色值分解

像素颜色值c是一个长整型的数值,占4个字节,最上位字节的值为“0”,其它3个下位字节依次为B、G、R,值为0~255。

从从值分解出R、G、B值可直接使用:

Colorc=newColor();

c=(i,j);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1