yehao's Blog

透明位图的显示的原理

对于透明位图显示,GDI有现成的函数TransparentBlt可以完成,在这我们自己写代码实现类似TransparentBlt的功能。

        为了说明这个透明位图显示的原理,我们就用一个最简单的单一色的图来说明:我们在一张背景色为红色RGB(255,0,0)的图片上绘制一个蓝色RGB(0,0,255)的圆,其中透明色为粉红RGB(255,0,255).如下图

透明位图的显示的原理 - 过客 - 过☆客

1)为绘制的图片创建遮罩图层。创建一个与要绘制的图片大小相同的1位单色位图,要绘制的地方为黑色,透明的地方为白色。如图:

透明位图的显示的原理 - 过客 - 过☆客

       这步用代码很容易实现,创建一个1位单色位图上,以透明色为背景,以非透明色为画笔色,将要绘制的图片画一遍就可以了。

//创建位图的遮罩图层
 HBITMAP hmask=CreateBitmap(256,256,1,1,NULL);
 HDC maskhdc=CreateCompatibleDC(NULL);

 SelectObject(Chdc,hbit);
 SelectObject(Chdc1,hbit1);
 SelectObject(maskhdc,hmask);

 //设置遮罩图层背景颜色
 SetBkColor(Chdc1,RGB(255,0,255));

 //生成遮罩位图
 BitBlt(maskhdc,0,0,256,256,Chdc1,0,0,SRCCOPY);

2)用要绘制的图片与背景图片做异或运算,得到的图片

要透明色的区域:红RGB(255,0,0) XOR 粉红RGB(255,0,255) = 蓝色RGB(0,0,255)

绘制区域:红RGB(255,0,0) XOR 蓝RGB(,0,255) = 粉红RGB(0,0,255),如下图:

透明位图的显示的原理 - 过客 - 过☆客

//目的和源做异或(XOR)运算
   BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);

3)用遮罩位图与上步完成的图片做与运算,得到的图片

要透明色的区域:蓝RGB(0,0,255) AND 白RGB(255,255,255) = 蓝色RGB(0,0,255)

绘制区域:粉红RGB(255,0,255) AND 黑RGB(0,0,0) = 黑色RGB(0,0,0),如下图:

透明位图的显示的原理 - 过客 - 过☆客

   //目的和源做异或(XOR)运算
   BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);

4)用要绘制的图片与上步完成的图片做异或运算,得到的图片

要透明色的区域:蓝RGB(0,0,255) XOR 粉红RGB(255,0,255) = 红色RGB(255,0,0)

绘制区域:黑RGB(0,0,0) XOR 蓝RGB(0,0,255) = 蓝RGB(0,0,255),如下图:透明位图的显示的原理 - 过客 - 过☆客

//目的和源做异或(XOR)运算
   BitBlt(backhdc,0,0,256,256,Chdc1,0,0,SRCINVERT);

        这样就完成了透明位图的显示了,原理和方法就是这样,用这样的方法可以扩展到非单色位图上来。在这就不多谈了,自己去试试就知道了,最后附上这个单色透明位图的源代码:

    VDISK下载 

posted on 2011-06-12 07:55 厚积薄发 阅读(1137) 评论(0)  编辑 收藏 引用 所属分类: Windows编程


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论