程序产生半透明效果的过程

步骤一:取得位图结构
使用GetObject函数,函数原型如下:
int GetObject(
        HGDIOBJ hgdiobj,      
// handle to graphics object 取得GDI对象结构
        
int cbBuffer,               // size of buffer for object information 结构大小
        LPVOID lpvObject    
// buffer for object information 结构变量
);
这里取得了GDI对象的信息,这里需要的是一个位图,其中第3个参数就应该为位图结构的地址.
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结构的程序代码如下:
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
);
程序代码则为:
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
);
半透明图完成后,就剩贴图操作了.
posted @ 2009-09-03 08:59  碧青_Kwok  阅读(1066)  评论(0编辑  收藏  举报