今日更新
技术新闻
精彩专题
IBM软件技术专区
微软开发专区
技术文档中心
编程语言
网络通信
网络安全
LINUX/UNIX
软件工程与管理
数据库开发
WEB开发
企业应用与开发
移动开发
资源中心
原创专栏
开放系统世界
人才与培训
技术天地论坛
厂商列表
社区推荐

· 女性身体内部人体受孕..
· 十部顶级的变态与情色..
· 感情放纵让我毁了两个..
· 当我撞见姐姐和男友在..
· 卖淫少女惨遭泄愤民工..
· 偷拍街上的走光mm绝对..
· 百度打击google的广告
· 港娱乐圈与黑社会揭秘
赛迪网>>技术应用>>重点推荐
关键字: vs.net;.net
来  源: 赛迪网
在Visual C#下实现图像的透明处理
作者:王凯明 发文时间:2003.01.10
以前编程实现图像的透明处理是比较困难的,代码量多,工作又复杂。不过,现在随着微软VS.Net开发工具的逐渐普及,伴随而来的新兴开发语言C#以及GDI+等新的编程机制正为广大开发人员所接受。本文就向大家介绍在Visual C#中,如何运用GDI+中Alpha Blending技术实现图像的透明处理。

在各类有关.Net的技术论坛上常有人问如何实现透明的图像或图形效果,答案很简单,就是Alpha Blending技术。Alpha Blending技术是一个混合各种颜色值并产生透明效果的过程。具体的实现原理也很简单:在GDI+中,任何一种颜色由四种成分组成――Alpha,Red,Green和Blue。其中的Alpha成分则代表了一种颜色的透明程度,它的值在0到255之间变化。不言而喻,0代表完全透明而255则表示完全不透明。因此,你只要用透明效果创建一种颜色并用该颜色来画图像就可以完成图像的透明处理了。

原理虽然比较简单,但是要初学者实际操作起来可能也并不是那么容易。所以下面我就向大家展示一个很好的实例。在该实例中,我先在窗体上画了一些图形,这些图形包括直线、曲线、椭圆等,同时这些图形有的是不透明的、有的是半透明的、有的是强透明的(注:其中的"强透明"意思为非常透明,几乎为全透明,但是又隐约可见)。如果你有GDI+编程的一些基本知识,完成这些应该并不困难。然后,我在这些图形上覆盖了一幅图像,在正常情况(也就是不透明的情况)下,窗体上的图形为图像所遮盖,所以应该是看不见的。接着,我通过一个按钮的消息响应函数使得图像具有透明效果,这样一来的话,窗体上原来的那些图形就会浮现出来。

实现方法


首先,打开VS.net,新建一个Visual C#的项目,选择模板为"Windows应用程序",同时不妨命名为"TransparentImage",图示如下:



图1


接着,进行窗体布局。往窗体上添加三个按钮以完成用户输入控制。将窗体的Text属性设置为"图像的透明处理示例";将三个按钮的Text属性分别设置为"半透明"、"强透明"、"不透明";同时,为界面美观起见将三个按钮的FlatStyle属性均设置为Flat。最终,窗体布局的图示如下:



图2


完成了窗体布局,我们接着开始编写代码。首先,我们添加窗体的Paint消息响应函数。读者可以发现,我们在进行窗体布局的时候并没有在窗体上添加pictureBox控件,那么我们怎么显示图像并画出各种图形呢?这就要用到窗体的Paint消息响应函数了,函数实现如下:

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
	{
		Graphics g = this.CreateGraphics();
		g.Clear(this.BackColor);
		DrawPerson();
		//画一幅图像 
	Image curImage = Image.FromFile(@"e:\photo.jpg");
	g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height);
		g.Dispose();
	}


(注:其中的e:\photo.jpg为笔者电脑上图像文件的路径,读者可以将它改为自己电脑上图像文件的路径,下同。该文件可在源代码文件夹中找到。)

在上面的函数中,我们先建立了一个Graphics对象,该对象就是专门用来画图形和图像的。我们还调用了本类的一个私有成员函数DrawPerson(),该函数实现的功能就是在窗体上画一些图形,这些图形包括了椭圆、曲线、三角形,而这些图形合在一起恰好构成了一个人的头部轮廓,所以我姑且将该函数命名为了DrawPerson()。在调用完毕后,就在窗体上画出一幅图像(用一个图像文件完成)。最后就是Graphics对象的Dispose工作。其中,DrawPerson()函数的具体实现如下:

private void DrawPerson()
	{
		Graphics g = this.CreateGraphics();
		g.Clear(this.BackColor);
		//画人头轮廓
		Rectangle rect1 = new Rectangle(75, 0, 150, 200); 
g.FillEllipse(new SolidBrush(Color.FromArgb(225, 155, 150, 25)), rect1);
	//定义三支画笔,其中第一支为不透明,第二支为半透明,第三支为强透明
	Pen opqPen = new Pen(Color.FromArgb(155, 120, 205, 190), 15);
	Pen transPen = new Pen(Color.FromArgb(128, 25, 150, 25), 12);
	Pen totTransPen = new Pen(Color.FromArgb(140, 120, 18, 10), 10);
		//画人头的眼睛
	Rectangle rect2 = new Rectangle(70, 0, 160, 80);
	g.DrawArc( opqPen, rect2, 30, 40 );
	g.DrawArc( opqPen, rect2, 110, 40 );
		//画人头的鼻子
Point[] threePoints=new Point[]{new Point(140, 130), new Point(160, 130), new 
Point(150, 80)};
g.DrawPolygon(transPen,threePoints);
	//画人头的嘴巴
	Rectangle rect3 = new Rectangle(110, 150, 80, 20);
	g.DrawEllipse(totTransPen,rect3);
	g.Dispose();
	}


请读者注意,在上面的函数中,我们定义画笔的时候定义了三支透明程度不同的画笔:不透明、半透明、强透明,如此一来就可以完成图形的透明效果。不过,图像的透明效果实现起来相对复杂,我将会在后面介绍。

这样,我们就完成了窗体的初始化工作。在运行程序后,窗体上就不是空白一片,而是有具体的图像了。由于我们的图像比较大,所以窗体上的图形在最初的时候是看不见的,只有当图像为透明时,其中的人头图形才会显现,这就正好符合我们程序的初衷了。

接下来,我们就着手实现图像的透明效果。在实现图像的透明效果过程中,我们需要用到了ColorMatrix和ImageAttributes等类,而这些类包含在System.Drawing.Imaging名字空间中,所以我们在源代码文件的开始处需添加:using System.Drawing.Imaging;来实现对这些类的调用。还有,ImageAttributes类是用来设置图像的一系列属性的,它被用作Graphics类对象的DrawImage方法的一个参数。而ImageAttributes类对象的方法SetColorMatrix则调用ColorMatrix来设置图像的颜色值。而图像的透明效果正是又ColorMatrix中部分值所决定的。下面就是具体的实现方法了。

添加三个按钮的消息响应函数如下:

"半透明"按钮:

private void button1_Click(object sender, System.EventArgs e)
		{
			Graphics g = this.CreateGraphics();
			g.Clear(this.BackColor);
			DrawPerson();
			Bitmap bitmap = new Bitmap(@"e:\photo.jpg");
			float[][] ptsArray ={ 
		new float[] {1, 0, 0, 0, 0},
		new float[] {0, 1, 0, 0, 0},
		new float[] {0, 0, 1, 0, 0},
	new float[] {0, 0, 0, 0.5f, 0}, //注意:此处为0.5f,图像为半透明
	new float[] {0, 0, 0, 0, 1}}; 
ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
ImageAttributes imgAttributes = new ImageAttributes();
//设置图像的颜色属性
imgAttributes.SetColorMatrix(clrMatrix,	ColorMatrixFlag.Default, 
ColorAdjustType.Bitmap);
//画图像
g.DrawImage(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
	0, 0, bitmap.Width, bitmap.Height,
	GraphicsUnit.Pixel, imgAttributes);
	g.Dispose();
}


"强透明"按钮:

private void button2_Click(object sender, System.EventArgs e)
		{
			Graphics g = this.CreateGraphics();
			g.Clear(this.BackColor);
			DrawPerson();
			Bitmap bitmap = new Bitmap(@"e:\photo.jpg");
			float[][] ptsArray ={ 
			new float[] {1, 0, 0, 0, 0},
			new float[] {0, 1, 0, 0, 0},
			new float[] {0, 0, 1, 0, 0},
		new float[] {0, 0, 0, 0.1f, 0}, //注意:此处为0.1f,图像为强透明
			new float[] {0, 0, 0, 0, 1}}; 
	ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
	ImageAttributes imgAttributes = new ImageAttributes();
	//设置图像的颜色属性
	imgAttributes.SetColorMatrix(clrMatrix,	ColorMatrixFlag.Default, 
ColorAdjustType.Bitmap);
	//画图像
g.DrawImage(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
	0, 0, bitmap.Width, bitmap.Height,
	GraphicsUnit.Pixel, imgAttributes);
	g.Dispose();
	}


"不透明"按钮:

private void button3_Click(object sender, System.EventArgs e)
		{
			Graphics g = this.CreateGraphics();
			g.Clear(this.BackColor);
			DrawPerson();
			//画一幅图像 
			Image curImage = Image.FromFile(@"e:\photo.jpg");
	g.DrawImage(curImage, 0, 0, curImage.Width, curImage.Height);
		g.Dispose();
	}


这样,我们就完成了三个按钮的消息响应函数,整个程序也完毕了。按下Ctll+F5运行程序,我们将得到如下所示的界面:



图3


上面的情况是最初始时的状态。所以我们只可以看到一幅图像却看不到后面的图形,为了验证后面的图形是否存在,我们点击"半透明"按钮。这样,上面的图像就呈半透明状态,我们可以通过该图像看到隐藏在图像后面的图形了,图形就是上面所说的人头啊。效果图示如下:



图4


不过这里的人头图形还不是那么明显,不用着急,最后还有一个"强透明"效果还没有试过呢,下面就看看效果如何吧。("不透明"就是恢复到原来的状态,不用解释了吧?呵呵!!)



图5


小结


本文通过一个实例向大家介绍了如何运用Visual C#实现图像的透明处理,其原理相对来说是比较简单的,这主要得归功于.Net框架中的类库,它们为我们提供了强大的功能,大大地简化了我们的编程工作。因此,要学习图像处理,就得掌握System.Drawing及其以下的各个命名空间中的类库。而要成为一名优秀的.Net程序员,学习整个.Net框架以及其类库才是最重要的,而并非是掌握那门编程语言的事。最后希望本文能对广大读者有所帮助。

源代码文件为TransparentImage.rar(下载)

(责任编辑 Sunny




赛迪网推出“IT博客”,花不到一分钟就完成注册
评论】 【推荐】 【 】 【打印】 【关闭

·Linux专区· ·黑客攻防·
· Linux下添加硬盘、分区、格式化任务详解
· FreeBSD服务器的安装与优化之优化篇
· 初学者入门:FreeBSD服务器的安装与优化
· 金企鹅杯两岸四地开源软件大赛圆满结束
· 如何提高Linux系统安全性的十大招数
· 构筑Linux防火墙之为个人用户设置防火墙
· 谁更安全?黑客眼中的防火墙与路由器
· 识破骗局 练就识别QQ活动真伪火眼金睛
· 应用安全大有可为:目的、挑战、总结
· 道高一尺魔高一丈:安全防御的动感魅力
· 警惕网络“内”院起火 积极谋求安内之路
· HHCTRL漏洞被黑客利用 疯狂传播木马
·中国信息化· ·成功案例·
· ERP普及化是饮鸩止渴 精细化才是应用之道
· 赛门铁克第八期《互联网安全威胁报告》解析
· 抢食“数字工商” 国产中间件杀出血路
· 从IBM等操作系统的发展看软件创新的启示
· 服务成就蓝色快车 品牌是怎样炼成的?
· 三大技术应用大会合为一体甲骨文上演三重奏
· 南阳教育城域网 拆掉学校间的“围墙”
· 金算盘助申意美步入信息化快车道
· 不为人知的索尼信息化 谁是幕后英雄?
· InforBus/Q在穗高速路联网收费系统中的应用
· J2EE构建最新金融理念和运作模式的网上银行
· 食品安全令人担心 信息化能否保驾护航
*姓  名: 更多资料 了解方案 认识厂商
*单位名称:
*联系电话:
*电子邮件:
    
◆ 相关文章   ◆ 站内热点推荐
· Visual C#实现不同窗体间数据传递之三
· .NET架构的核心开发技术
· Visual C#的SQL Server编程
· 在.Net窗体应用程序中载入Web页
· 灵活的.NET体系结构之简化配置服务
· 网管员论坛
· 开发者之家
· WLAN无限未来
· 我是如何掉进C#的……
· 中国“人件”非正式调查

   
合作网站: IBM dW中国网站 LinuxAID 软件工程专家网 中国系统分析员 UMLChina MATRIX Mobile2008 JavaResearch 华储网 UML软件工程组织 中国JAVA手机网 JAVA中文站 金山在线 海量科技