一、基本思路
1.半透明的原理
一张位图由许多像素组成,而每一像素包含R、G、B三原色,三原色的值决定了像素的色彩,要实现半透明效果,需要把前景图 和背景图彼此对应的像素颜色按某一比例进行调配,称为 ‘不透明度’,直接贴图,则前景图不透明度为100%,背景图为0%;
公式:半透明图色彩=前景图色彩 * 不透明度 + 背景图色彩 * (1-不透明度)
2.半透明操作步骤
(1)取得位图结构,需要使用GetObject函数,介绍如下:
函数原型:int GetObject(HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
函数功能:表示获取位图的信息
参数一 : 要获取的位图句柄
参数二 : 指定将要写到缓冲区的信息的字节数目,在这里是位图类型的字节数
参数三 : 在这里是指向位图结构变量的地址,该变量当作缓冲区
关于位图结构BITMAP介绍如下:
(2)建立暂存数组,目的是为了存储位图中所有像素的颜色值
unsigned char * px1 = new unsigned char [bm1.bmHeight * bm1.bmWidthBytes];
其中数组的大小即为整个位图所有像素占的字节数,若一个像素24bits,则占3个字节,也就是3个数组元素
(3)取得位图中所有的颜色值,并存储到暂存数组中,函数介绍如下:
函数原型:LONG GetBitmapBits(HBITMAP hbmp, LONG cbBuffer, LPVOID lpvBits);
函数功能:把位图的色彩值存储到暂存数组中
参数一 :位图句柄
参数二 :要取得的字节数
参数三 :指向暂存数组
(4)合成像素颜色值,这里介绍基本思想:
假设每个像素24bit,则每个像素占3字节,关于背景图,首先要取得整张图像素各原色值所在的索引值,即: