程序产生半透明效果的过程
步骤一:取得位图结构
使用GetObject函数,函数原型如下:
这里取得了GDI对象的信息,这里需要的是一个位图,其中第3个参数就应该为位图结构的地址.使用GetObject函数,函数原型如下:
int GetObject(
HGDIOBJ hgdiobj, // handle to graphics object 取得GDI对象结构
int cbBuffer, // size of buffer for object information 结构大小
LPVOID lpvObject // buffer for object information 结构变量
);
HGDIOBJ hgdiobj, // handle to graphics object 取得GDI对象结构
int cbBuffer, // size of buffer for object information 结构大小
LPVOID lpvObject // buffer for object information 结构变量
);
Windows API中所定义的位图结构(BITMAP)如下:
typedef struct tagBITMAP {
LONG bmType; // 位图类型,必须设为0
LONG bmWidth; // 位图宽度
LONG bmHeight; // 位图高度
LONG bmWidthBytes; // 每一列像素所站Byte数
WORD bmPlanes; // 颜色平面数
WORD bmBitsPixel; // 颜色像素的位数
LPVOID bmBits; // 位图内存的指针
} BITMAP, *PBITMAP;
假设现在有一个位图名称为"bitmap",位图结构变量名称为"bm",则使用GetObject()函数取得BITMAP结构的程序代码如下:LONG bmType; // 位图类型,必须设为0
LONG bmWidth; // 位图宽度
LONG bmHeight; // 位图高度
LONG bmWidthBytes; // 每一列像素所站Byte数
WORD bmPlanes; // 颜色平面数
WORD bmBitsPixel; // 颜色像素的位数
LPVOID bmBits; // 位图内存的指针
} BITMAP, *PBITMAP;
GetObject(bitmap.sizeof(BITMAP),&bm);
步骤二:建立暂存数组
建立一个暂存数组准备存储位图中所有元素的颜色值.数组的大小是由前一个步骤中所取得位图的bmHeight和bmWidthBytes决定的,因此,必须利用指针来动态建立.
延续前面的例子,若要建立一个可存储bitmap所有像素颜色值的暂存数组,使用程序代码如下:
unsigned char *px = new unsigned char [bm.bmHight * bm.bmWidthBytes];
步骤三:取得位图的位值
建立了暂存数组后,要取出位图的所有颜色值存储到数组中就简单多了.利用下面的API函数:
LONG GetBitmapBits(
HBITMAP hbmp, // handle to bitmap
LONG cbBuffer, // number of bytes to copy
LPVOID lpvBits // buffer to receive bits
);
程序代码则为:HBITMAP hbmp, // handle to bitmap
LONG cbBuffer, // number of bytes to copy
LPVOID lpvBits // buffer to receive bits
);
GetBitmapBits(bitmap,bm.bmHight * bm.bmWidthBytes,px);
步骤四:合成像素颜色值
按照不透明度来设定每个半透明区域的颜色值.
此时应该有两个像素颜色数组,一个是前景图的,一个是背景图的.将两个数组算出对应的元素进行颜色合成运算.
公式: 半透明图色彩=前景图色彩*不透明度+背景图色彩*(1-不透明度)
运算后再将结果存回暂存数组,此时数组中所存储的就是已经完成的半透明颜色值了.
步骤五:重设位图颜色
使用API函数SetBitmapBits:
LONG SetBitmapBits(
HBITMAP hbmp, // handle to bitmap
DWORD cBytes, // number of bytes in bitmap array
CONST VOID *lpBits // array with bitmap bits
);
半透明图完成后,就剩贴图操作了.
HBITMAP hbmp, // handle to bitmap
DWORD cBytes, // number of bytes in bitmap array
CONST VOID *lpBits // array with bitmap bits
);
©2009-2010 lovelovelt. All Rights Reserved.