现在的位置: 首页 > 综合 > 正文

如何画透明位图

2013年09月11日 ⁄ 综合 ⁄ 共 3039字 ⁄ 字号 评论关闭

From:http://www.vckbase.com/bbs/prime/viewprime.asp?id=391

 

(Hermess发表于2002-5-24 22:17:41)

画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。
  假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形
状是一样的。比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作
就可以了。

用VC++ MFC实现的代码如下:

  你会看到红色的字母A透明地画在背景上了。用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的
方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

用VC++ MFC实现的代码如下,这是一个用来画透明位图的函数:

CDC *pDC 需要画位图的CDC指针,
UINT IDImage 位图资源ID,
Crect &rect 指定位图在pDC中的位置,
COLORREF rgbMask 位图的透明色

 

第二种方法,即指定一种透明色生成透明位图,可以参照MSDN的一个例子。

图形图像的一部分不改变屏幕的内容称为“透明”。
DrawIcon函数可以创建一个包含透明部分的图像。也可以用
BitBlt函数实现这个功能,但是要做一些额外的步骤。

下面的九步操作说明了绘制透明位图的过程:
1.创建一个DC用来保存图像位图。
2.选择图像位图到DC。
3.创建一个记忆DC用来保存最终图像。这个DC是目的DC。
4.把屏幕中需要被图像覆盖的部分复制到目的DC。
5.创建一个“与遮罩”用来容纳遮罩颜色,
  为了做到这一点,执行以下三步操作:
  a.把图像DC的背景颜色设置为图像中需要透明的颜色。
  b.创建一个单色DC。
  c.把图像BitBlt到这个单色DC。
  这样就会生成一个“与遮罩”位图,对应背景色部分的
  像素设置为白色(1),所有其他像素设置为黑色(0)。
6.用光栅操作码为SRCAND的BitBlt将“与遮罩”复制到目的DC。
7.用光栅操作码为SRCAND的BitBlt将“与遮罩”的反位图复制到图像DC。
8.用光栅操作码为SRCPAINT的BitBlt将图像DC复制到目的DC。
9.用BitBlt将目的DC的内容复制到屏幕中适当的地方。

(待续) ( ChenJiqing 发表于 2006-9-21 12:47:00)

抱歉!评论已关闭.