我想实现在一个地图上显示半透明的数据信息,类似天气预报中等压图的处理。  
如何才能实现这个背景图和最上层图的相互映射,完成半透明的效果?  
---------------------------------------------------------------  
 
用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+

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

  1. php将二维码和文字结合到一个背景图片上,合成一张图

    将二维码生成到背景图片上,并且文字生成到背景图上,可以无限制扩增 1.生成前的图片  生成后的图片   class codeImg {private $date,$img,$main,$width,$ ...

  2. CSS控制背景颜色和背景图像的方法

    Web前端培训中比较重要的一环是网页的设计,网页能通过背景图像给人留下第一印象,如节日题材的网站一般采用喜庆祥和的图片来突出效果,所以在网页设计中,控制背景颜色和背景图像是一个很重要的步骤.下面将详细 ...

  3. html 颜色叠加图片,如何在背景图片上添加颜色叠加?

    一只名叫tom的猫 我看到2个简单的选择:在图像上具有半透明单个渐变的多个背景巨大的插图阴影渐变选项:html {  min-height:100%;  background:linear-gradi ...

  4. 2021-09-21如何在PCB上做一个城市地铁图?

    这是一个电子技术不怎么行(三极管的原理都是刚弄明白),但却创意满满的创客做的作品,他是一位华人小哥(Chai Jia Xun),住在旧金山湾区.他先前曾做过一款生命倒计时(Lifeclocc)的作品, ...

  5. 如何用直播摄像机、编码器、电脑端OBS软件在抖音平台上做推流直播现实背景

    现实背景 自2021年以来,抖音平台提高了电脑推流直播门槛,导致很多人无法通过电脑软件做推流直播,也无法通过第三方推流工具做直播,具体要求如下图所示: 抖音平台的新规则如下: 硬性条件: 1. 需实名 ...

  6. CSS背景图像的简单响应

    本文设有很多,最理想的解决方案,响应图像只是其中之一.我们建议您查看不同的方法,然后再选择一个特定的响应图像解决方案,包括这两个:如何避免重复下载响应图像中选择响应图像解决方案. 大家都在谈论的的sr ...

  7. CSS揭秘:5.条纹背景(上)

    文章目录 条纹背景 CSS线性渐变 css线性渐变小结 background-size 水平条纹 水平 First Try 水平 Second Try 水平 Third Try 水平 Forth Tr ...

  8. html中设置背景图像填充,CSS-定位背景图像,添加填充

    CSS-定位背景图像,添加填充 这个问题在这里已有答案: CSS:背景图片和填充                                     8个答案 我想将背景添加到div,位置居中,但 ...

  9. 【论文学习】行人检测——CVPR:通过MIMS在低分辨率图像中做行人检测

    论文:Pedestrian Detection in Low-resolution Imagery by Learning Multi-scale Intrinsic Motion Structure ...

最新文章

  1. [Nancy On .Net Core Docker] 轻量级的web框架
  2. 《星球大战:前线2》预告片发布
  3. Redis学习手册(Sorted-Sets数据类型)
  4. 解析JVM内存区域组成
  5. labelme标注工具实现json标注数据批量转换
  6. command shortcut paste
  7. 大学计算机应用与基础第二版答案,大学计算机应用基础(第2版)上机指导与习题集...
  8. 如何优雅地使用迅雷下载百度云大文件?
  9. 左右手桌面股票盯盘软件(DesktopStockTracking)
  10. java method方法_Java Method getDeclaringClass()方法
  11. CURL 发送请求详解
  12. 基于python随机产生英文单词,句子,段落
  13. python许可证_一图看懂各种许可协议
  14. 企业领袖必备的八大特质
  15. 辉煌一时的金立如今却沦为山寨机?只因做错了这一点
  16. 语音合成10107错误码解决记录
  17. 2022-2028全球与中国成人注意力缺陷和多动障碍市场现状及未来发展趋势
  18. 微信如何实现自动跳转到用其他浏览器打开指定页面下载APK的方案
  19. 如何正常识别段码液晶屏好坏?
  20. 网络机顶盒usb调试模式打开

热门文章

  1. pgpool-II的性能缺陷(二)
  2. lable、ul、ol、dl和table、fieldset标签
  3. Ubuntu 上 hi3531 交叉编译环境 arm-hisiv100nptl-linux 建设过程
  4. 如何解决Linux操作系统找不到网卡的问题
  5. Windows Azure 解决方案系列:组合拍卖供应商以云服务快速拓展,并节省成本
  6. 中国如何成为一流国家
  7. scala(3):class和object,trait的区别
  8. Linux用户管理-服务管理
  9. Mysql 添加用户和数据库授权
  10. Verilog有符号数运算