如何在一个背景图像上,做半透明的图。

我想实现在一个地图上显示半透明的数据信息,类似天气预报中等压图的处理。  
如何才能实现这个背景图和最上层图的相互映射,完成半透明的效果?  
---------------------------------------------------------------  
 
用TransparentImage()就可以了,  
要解决闪烁的问题就用双缓冲来实现,  
在这里搜双缓冲可以得到大量的信息  
---------------------------------------------------------------  
 
你可以使用windows的一个api  
AlphaBlend  
用法和BitBlt差不多啊,很好用的,我们一直都用他.  
 
BLENDFUNCTION  bf;  
bf.AlphaFormat=0;  
bf.BlendFlags=0;  
bf.BlendOp=AC_SRC_OVER;  
bf.SourceConstantAlpha=100;//透明度0-255  
 
AlphaBlend(hBackDC,0,70,73,20,hMaskDC,0,0,73,20,bf);  
 
不可以在WindowsCE里用  
---------------------------------------------------------------  
 
http://www.vckbase.com/document/viewdoc.asp?id=532  
 
里面有详细的介绍及代码  
---------------------------------------------------------------  
 
你可以参考一下下面的代码  
这段代码就是创建一个半透明的位图:  
其中的主要函数有  
GetBitmapBits();  
SetBitmapBits()  
由于位图文件中的点是又红绿蓝三种颜色组成,所以位图文件在内存中的存储格式如下:  
gbr  gbr  gbr  gbr  
..............  
..............  
从上面可以看出,每个点占3x1个像素,而且顺序是按gbr的顺序排列的,设置图象透明其实就是设置每个点的透明度,好好看看下面的代码吧!我想应该对你有帮助!  
BITMAP  bm;  
           int  x,y,s,t,m,i=0;  
           GetClientRect(&rect);  
           mdc  =  new  CDC;                  
           bitmap  =  new  CBitmap;  
           bgbmp  =  new  CBitmap;  
           mdc->CreateCompatibleDC(dc);  
           bgbmp->m_hObject  =  (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);  
           bitmap->m_hObject  =  (HBITMAP)::LoadImage(NULL,"girl.bmp",IMAGE_BITMAP,298,329,LR_LOADFROMFILE);  
           bitmap->GetObject(sizeof(BITMAP),&bm);  
           unsigned  char  *px  =  new  unsigned  char[bm.bmHeight*bm.bmWidthBytes];  
           bitmap->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px);  
           s  =  bm.bmHeight;  
           t  =  bm.bmWidth;  
           m  =  bm.bmWidthBytes;  
           for(y=0;y<bm.bmHeight;y++)  
                       for(x=0;x<bm.bmWidth;x++)  
                       {  
                                   //px[x*3+y*bm.bmWidthBytes]  *=  0.5;  
                                   px[x*3+y*bm.bmWidthBytes]  =  (unsigned  char)(px[x*3+y*bm.bmWidthBytes]*0.5);  
                                       //px[x*3+1+y*bm.bmWidthBytes]  *=  0.5;    
                                   px[x*3+1+y*bm.bmWidthBytes]  =  (unsigned  char)(px[x*3+1+y*bm.bmWidthBytes]*0.5);  
                                       //px[x*3+2+y*bm.bmWidthBytes]  *=  0.5;  
                                   px[x*3+2+y*bm.bmWidthBytes]  =  (unsigned  char)(px[x*3+2+y*bm.bmWidthBytes]*0.5);  
             
                       }  
           bitmap->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px);    
           bgbmp->GetObject(sizeof(BITMAP),&bm);  
           unsigned  char  *py  =  new  unsigned  char[bm.bmHeight*bm.bmWidthBytes];  
           bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,py);  
           for(y=100;y<100+s;y++)  
           {  
                       i  =  (y-100)*m;  
                       for(x=100;x<100+t;x++)  
                       {  
                                   //py[x*3+y*bm.bmWidthBytes]  =  py[x*3+y*bm.bmWidthBytes]*0.5  +  px[i];  
                                   py[x*3+y*bm.bmWidthBytes]  =  (unsigned  char)(py[x*3+y*bm.bmWidthBytes]*0.5  +  px[i]);//设置透明度为50%  
                                       //py[x*3+1+y*bm.bmWidthBytes]  =  py[x*3+1+y*bm.bmWidthBytes]*0.5  +  px[i+1];  
                                   py[x*3+1+y*bm.bmWidthBytes]  =  (unsigned  char)(py[x*3+1+y*bm.bmWidthBytes]*0.5  +  px[i+1]);  
                                       //py[x*3+2+y*bm.bmWidthBytes]  =  py[x*3+2+y*bm.bmWidthBytes]*0.5  +  px[i+2];  
                                   py[x*3+2+y*bm.bmWidthBytes]  =  (unsigned  char)(py[x*3+2+y*bm.bmWidthBytes]*0.5  +  px[i+2]);  
                                       i=i+3;              
                       }  
           }              
           bgbmp->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,py);  
           mdc->SelectObject(bgbmp);  
           delete  []px;//删除数组一定要用这种形式  
           delete  []py;  
 
希望对你有所帮助!  
---------------------------------------------------------------  
 
当然能了。  
你只要#include  <wingdi.h>  
再链接了msimg32.lib  
一切没有问题!!  
 
有文档说在98下有问题。但是我用到现在也没有问题  
放心用吧!!  
---------------------------------------------------------------  
 
『Alpha-Blending』  
     所谓  Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素,一般用来处理半透明效果。  
 
Alpha-Blending  技术并简单介绍  Alpha-Blending  技术的具体算法。  
 
  所谓  Alpha-Blending,其实就是按照“Alpha”混合向量的值来混合源像素和目标像素。为了便于理解,我们就从两个像素间的  Alpha-Blending  过程谈起吧。  
 
  第一步,先把源像素和目标像素的  RGB  三个颜色分量分离,然后把源像素的三个颜色分量分别乘上  Alpha  的值,并把目标像素的三个颜色分量分别乘上  Alpha  的反值,接下来把结果按对应颜色分量相加,再对最后求得的每个分量结果除以  Alpha  的最大值(通常这一步都是用移位来完成,这亦是  Alpha  的最大值为何总是二的幂的原因),最后把三个颜色分量重新合成为一个像素输出。  
 
  在这个过程中,为了分离像素中的  RGB  三个颜色分量,我们一般会使用掩膜的方法。至于具体的三个掩膜值:RMask、GMask  和  BMask,可以从  DirectDraw  中的  DDPixelFormat  返回得到(当然,你也可以根据自己的需要做各种灵活处理)。  
 
  在下面给出的说明性例程中,我们假设  RMask、GMask  和  BMask  已经存放的是  RGB  三个颜色分量的位掩膜值,Alpha  的最大值为  256,而  source  和  dest  是指向源像素和目标像素的指针。  
 
int  ialpha  =  256  -  *alpha;  //  Alpha  的反值  
 
*dest  =  (RMask  &  (((*source  &  RMask)  *  *alpha  +  (*dest  &  RMask)  *  ialpha)  >>8))    ¦  (GMask  &  (((*source  &  GMask)  *  *alpha  +  (*dest  &  GMask)  *  ialpha)  >>8))    ¦  (BMask  &  (((*source  &  BMask)  *  *alpha  +  (*dest  &  BMask)  *  ialpha)  >>8));  
 
---------------------------------------------------------------  
 
GDI+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值