实现透明位图时对单色位图与颜色位图转换的思考

来源:互联网 发布:办公软件excel教程 编辑:程序博客网 时间:2024/04/30 18:42

 

在资源中创建如下位图,资源ID是:IDB_BITMAP1。

 

 

加载位图IDB_BITMAP1:

 

得到该位图的BITMAP结构,后面会通过该结构使用位图的宽和高。

 

 

创建一个单色位图(也就是所谓的掩码图):

 

设置源位图的背景色为要被透明的颜色并拷贝源位图到掩码位图,对于IDB_BITMAP1,我们要透明的颜色是红色,所以,用如下代码:

 

此时,要补充一个知识点,那就是单色位图与颜色位图之间的转换操作。

 

当目标dc的位图是颜色位图,源dc的位图是单色的时候,单色位图在实际的光栅操作(ROP)之前会被转换成颜色位图,对应的位如果是0,则被转换目标dc的前景色,如果该位是1,则被转换成目标dc的背景色。相反,如果目标dc的位图是单色位图,源dc的位图是颜色位图,则在实际光栅操作之前要把颜色位图转换成单色位图,转换规则是,颜色位图中所有和背景色一致的象素都变成1,其他的象素都被转换成0。

 

以上这些是本人自己的观察,理解和总结,至今还没有查到官方的描述。

 

 

根据上面的结论,现在的掩码位图是下面的样子了:

 

此时,相当于有了两个位图,一个是源位图,一个是掩码位图。下面有两种方法实现透明的效果。不过下面生成透明图的方法前提必须保证最终dc,本例里的pDC的前景色是黑色,背景色是白色。如果不是,需要先设置,但记得操作完之后设置会原来的颜色。

1.

 

 

2.也是网上大多数的实现:源位图与目标设备进行异或操作,然后掩码位图与目标设备进行与操作,最后源位图再和目标设备进行一次异或操作:

 

 

 

 

最后别忘删除暂用的dc,我这里就略了。

 

 

 

 

 

 

 

 

原创粉丝点击