VC++实现位图显示透明效果--实现原理

我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来。本文所使用的原始位图及程序编译运行后的界面效果如下图所示:


图一、原始位图

图二、对话框界面上透明显示位图

  一、实现方法

  绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色"。通过将位图的背景色指定为"透明色",在绘制时,不绘制这部分背景,而仅绘制图像,这样就可以将位图中图像透明地绘制到窗口上。 

  绘制"透明"位图的关键是创建一个"掩码"位图(mask bitmap),"掩码"位图是一个单色位图,它是位图中图像的一个单色剪影。在Windows编程中,绘图都要用到设备描述表,我们需创建两个内存设备描述表:位图设备描述表(image DC)和"掩码"位图设备描述表(mask DC)。位图设备描述表用来装入位图,而"掩码"位图设备描述表用来装入"掩码"位图。在"掩码"位图设备描述表中制作"掩码"位图的方式是:先创建一个单色的Bitmap,装入mask DC,然后,以"SRCCOPY"的方式将装有位图的位图设备描述表绘制(BitBlt)到mask DC上。这样,mask DC的显示平面中的位图即是"掩码"位图。 

  一般情况下,绘制"透明"位图的实际操作步骤如下:

  1、甚至待显示位图的背景颜色,也就是设置我们希望透明显示的位图颜色;

  2、位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上;

  3、"掩码"位图设备描述表以"SRCAND"的方式绘制(BitBlt)到显示设备描述表上;

  4、再将位图设备描述表以"SRCINVERT"的方式绘制(BitBlt)到显示设备描述表上。这样除"透明色"外的其余位图部分(图像部分)就被绘制到窗口上了。

  上述操作中需要用到的位图显示函数BitBlt()的原型和说明如下:

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, 
int ySrc, DWORD dwRop );

  其中,参数int x表示贴到目的地的左上角X坐标;int y表示/贴到目的地的左上角Y坐标;int nWidth表示贴到目的地的区域宽度;int nHeight表示贴到目的地的区域高度;CDC* pSrcDC表示存储源位图的设备描述表;int xSrc表示源位图的左上角X坐标;int ySrc表示源位图的左上角Y坐标;DWORD dwRop为柵格运算标志(ROP),它明确定义了如何将源文件、目标文件和模式(由现在选出的刷子画笔定义)的位组合去形成一个目标文件。对于所有的设备类型,光栅操作(ROP)只简单地在表示位图颜色的每一个bit位上展开相关操作而不考虑他们的实际意义。微软为位图的光栅操作提供了多种方法,开发人员可以使用不同的组合得到想要的特殊效果。由于篇幅的限制,本文只讨论四种常用的光栅操作: 

操作方式 运算方式 效果
SRCCOPY src 直接将源位图拷贝到目的设备上。
SRCAND src AND dest 将目标文件中对应于源文件黑色区域的部分变黑,将对应于白色区域的部分留着不动。
SRCINVERT src XOR dest 将源插入到目标。二次使用时,将目标恢复到它原来的状态。在某种条件下可以代替SRCPAINT 操作。
SRCPAINT src OR dest 将源文件中的白色区域刷到目标文件中。源中的黑色区域不转换到目标中。

  这里补充说明一点,显示位图的背景颜色可以通过PhotoShop等图像处理软件获取,当然,也可以通过读取位图上特殊位置上的像素点的颜色来获取,前者实现起来比较方便,后者稍微麻烦一些,这可以根据个人爱好自由选择。

 

时间: 2024-10-06 12:39:15

VC++实现位图显示透明效果--实现原理的相关文章

visual C++游戏绘图之透明效果制作原理

作者:晋文格墨    邮箱: chairperson@sina.cn    透明效果 由于所有的图文件都是以矩形来储存的,我们也许会需要把一张易拉罐图片贴到窗口的背景图上,而这种情况下如果直接进行贴图,结果如下图: 这似乎不是我们想要的结果. 为了得到透明效果,我们需要运用到BitBlt()贴图函数以及其参数Raster的值来将图片中不必要的部分去掉(又称去背),使得图中的主题可以与背景完美融合. 制作透明效果有很多种方法,但是基本上都是利用贴图时不同的Raster运算,通过转换而产生相同的透明

关于Firefox中的Flash不可以显示透明效果的问题_经验交流

由于自己站点的首页用了透明Flash.在IE核心的浏览器显示一切正常.可到了Firefox里面就没有了透明效果,特别是有些站点用的是全页面的透明Flash这样鼠标不能穿透,真就伤脑筋了.今天特地到Firefox社区去寻找答案去了.结果是我们的代码不标准,还好我用的Flash不多.赶紧改了试试.[sleepy]问题解决. 原来要在Embed标签下加上wmode="transparent"这个属性. 相关代码如下:  程序代码 复制代码 代码如下: <embed src="

VC++实现显示透明的256色以上的图标

在学习Visual C++编程的过程中,有很多朋友可能会问Visual C++中如何保证256色以上的图标加载后不失真.虽然有介绍如何实现256色以上的工具栏的文章,但是方法中大都采用加载一幅256色以上的工具栏位图的方法.这样的方法存在一个麻烦就是用什么简便好用的制图工具来做这样的位图呢?相信读者朋友都希望能有更直接的方法来使用256色以上的图标,并且能够以透明的效果不失真地将图标显示出来.本实例介绍了实现上述目标的方法,实现了在工具条上显示透明的256色位图. 一.实现方法 一般情况下,我们

在C++ Builder中显示透明位图

我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式不支持透明显示.在Microsoft照片编辑器中位图若以设置成透明色方式存储,则提示出错.然而,在C++Builder中,却可以轻而易举地显示透明位图.透明位图与透明GIF图像相比有一个很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩色. ----在C++Builder中显示透明位图 ----1.采用TImage组件. ----下面,我们制作一幅飞机凌空飞过蓝天的简单动画.因为移动的飞机是用透明位图显示的,所

位图-mfc显示透明背景代码看不大懂

问题描述 mfc显示透明背景代码看不大懂 /*-----------------显示透明背景图片-------------------*/ void CHIT_MOUSE::TransparentBitmap(HDC hdc HBITMAP hBitmap short xStart short yStart short xadd short yadd COLORREF cTransparentColor){ BITMAP m_bm; COLORREF cColor; // 创建临时DC HDC

使窗体拥有透明效果的API

一.背景 FlashGet的透明效果大家羡慕吧.传统的Windows应用程序想实现半透明效果,一般来说需要处理自己的窗口的WM_Paint消息窗口,很麻烦.现在好了,SetLayeredWindowAttributes是windows的新api,win2000以上才支持,它能使使窗体拥有透明效果.我在Google搜了下,介绍SetLayeredWindowAttributes的文章大多是delphi的和vb的.好不容易找到一篇vc的,依法炮制后,vc的IDE却说我SetLayeredWindow

新颖实用的显示图片效果

图片效果|显示 Lightbox--新颖实用的显示图片效果 "Lightbox"是一个别致且易用的图片显示效果,它可以使图片直接呈现在当前页面之上而不用转到新的窗口.文字表述显然不够明了,所以请先看一下 Lightbox 的演示页面. 如何使用? Lightbox能非常简单地应用到您的页面上.首先将lightbox.js包含到您页面的header部分: <script src="lightbox.js" type="text/javascript&q

透明效果的网页设计:巧妙运用透明效果

文章描述:学会运用透明效果绝对是你增长设计经验的捷径.像运用其他效果一样,充分运用这项技术,并在不同的情境下检验,使其达到预期的效果.想要掌握它,最大的挑战就是在图文并茂的情况下确保文本的可读性,并且透明的部分不会遮挡到下面的图层.多去尝试一些不同程度和形式的 运用好透明效果是提高网页设计水准的重要方法之一.如同使用其他方法一样,设计师们有很多种手段将透明效果运用到网页中,今天这篇文章就来好好和您分享一下关于"透明"的实用小技巧哟:) 在网页设计中使用透明效果是件既美观又冒险的事儿.透

Lightbox—新颖实用的显示图片效果

图片效果|显示 Lightbox--新颖实用的显示图片效果 "Lightbox"是一个别致且易用的图片显示效果,它可以使图片直接呈现在当前页面之上而不用转到新的窗口.文字表述显然不够明了,所以请先看一下 Lightbox 的演示页面. 如何使用? Lightbox能非常简单地应用到您的页面上.首先将lightbox.js包含到您页面的header部分: <script src="lightbox.js" type="text/javascript&q