http://blog.csdn.net/virtualjxc/archive/2007/09/19/1791063.aspx
由于所有的图文件都是以一个四方矩形的形式来存储的,但有时我们可能会需要把一张怪物图片贴到窗口的背景上,而在这种情况下我们如果直接进行贴图的话,就会把这张图片的背景也一起贴到窗口背景图片中去,这当然不是我们想要的,所有我们就有必要把要贴的图片的不需要的部分给去了,就是所谓的图片透明效果处理。
主要就是利用BitBlt()贴图函数以及Raster值的运算来将图片中不必要的部分去掉(又称去背),使得图中的主题可以与背景图完全融合。制作透明效果有多种方法,但基本上都是利用贴图时不同的Raster运算,通过转换而最后产生相同的透明效果。在这里先来介绍一种透明运算的方法:
首先得准备一张位图:
图中左边的图是要去背并贴到背景上的前景上的前景图,右边的黑白图称为“屏蔽图”,在透明的过程中会用到它。把要去背的位图与屏蔽图合并成同一张图,透明的时候再按照需要来进行裁切。可以把它分成两张图,但这样程序就得运行两次图文件的加载的操作。下面的贴图步骤:
(1):将屏蔽图与背景图做“AND"(Raster值为SRCAND)运算,贴到目的地DC中;
(2):将前景图与背景图作“OR”(Raster值为SRCPAINT)运算,贴到目的DC中。
为什么这样就会产生透明的效果呢?
这是因为:白色的RGB值为(255,255,255),二进制即为 111111111111......
黑色的RGB值为(0,0,0),龙江二进制即为 000000000000......
运算过程:
1:屏蔽图与背景图做“AND”运算
(1)屏蔽图中的图中的黑色部分与背景图作”AND“运算:
000000........---------------------屏蔽图中黑色图点的颜色值
AND)011010.......---------------------背景图中彩色图点的颜色值
000000.....------------------------运算后为黑色
(2)屏蔽图中的白色部分与背景图做”AND“运算:
11111........---------------------屏蔽图中白色图点的颜色值
AND)011010.......---------------------背景图中彩色图点的颜色值
011010.....------------------------运算后还是原来背景图的色彩
2,前景图与背景图作”OR”运算:
(1)前景图中的彩色部分与上面运算后的图作“OR”运算:
101011........---------------------前景图中彩色图点的颜色值
OR) 000000.......---------------------背景图中变成黑色图点的颜色值
101011.....------------------------运算后变成前景图的色彩
(2)前景图中的黑色部分与上图运算后的图作“OR”运算:
000000........---------------------前景图中黑色图点的颜色值
OR) 101010.......---------------------背景图中彩色图点的颜色值
011010.....------------------------运算后还是原来背景图的色彩
经过这一运算后所显示的画面就是所需要的透明图了。
Note;
BOOL BitBlt( HDC 目的DC ,//贴图
int 目的DC X坐标, int 目的DC Y坐标, int 贴到目的DC的宽度,
int 贴到目的DC的高度, HDC 来源DC, int 来源DC X坐标, int 来源 DC Y坐标,
DWORD 贴图方式);