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

步骤一:取得位图结构
使用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
);
半透明图完成后,就剩贴图操作了.

转载于:https://www.cnblogs.com/lovelovelt/archive/2009/09/03/1558643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值