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

博客围绕在地图上显示半透明数据信息展开,提出实现背景图和上层图相互映射及半透明效果的问题。介绍了使用TransparentImage()、双缓冲、Windows的AlphaBlend API等方法,还给出创建半透明位图的代码,以及Alpha - Blending技术的算法。
我想实现在一个地图上显示半透明的数据信息,类似天气预报中等压图的处理。  
如何才能实现这个背景图和最上层图的相互映射,完成半透明的效果?  
---------------------------------------------------------------  
 
用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+
<think>好的,用户现在想在HTML中实现背景图像半透明效果。之前已经帮助他给盒子加上了背景片并铺满,现在需要进一步让背景半透明。根据用户提供的引用资料和之前的对话,我需要综合几种方法来解决这个问题。 首先,用户提到的引用[1]展示了使用rgba来设置背景颜色半透明,但这里需要的是半透明。直接对容器设置opacity会影响所有子元素,比如文字也会变透明,这显然不符合需求。引用[2]中提到用filter属性,但这种方法可能会影响子元素,而且兼容性有问题。引用[3]和[5]提到了CSS的cross-fade()函数,这可能是现代浏览器的一个解决方案。引用[4]提到了使用伪元素和渐变叠加,这种方法比较经典,兼容性也较好。 考虑到用户之前已经用到了伪元素和线性渐变叠加的方法,可能这种方法更容易整合到现有代码中。另外,cross-fade()虽然更简洁,但需要检查浏览器兼容性,可能不适合所有情况。而伪元素方法通过创建一个半透明的遮罩层,不会影响子元素的内容,是比较可靠的法。 接下来,我需要整理出几种不同的实现方法,并说明它们的优缺点。第一种方法是使用伪元素叠加半透明层,这种方法兼容性好,实现简单。第二种是使用cross-fade()函数,适合现代浏览器。第三种是使用背景渐变叠加,类似之前添加遮罩的方式,但需要调整透明度。此外,还要提到避免使用opacity的原因,因为它会影响子元素。 最后,确保用户明白如何替换片路径,调整透明度,以及不同方法的适用场景。可能用户需要的是不影响文字显示的半透明背景,所以重点要放在如何只让背景片透明,而内容保持不透明。同时,提醒用户注意浏览器兼容性问题,特别是cross-fade()可能需要前缀或者不被旧浏览器支持。</think>根据引用[1][3][5]中关于背景图像透明化的实现方案,结合最新CSS特性,以下是三种主流实现方法及其原理: --- ### 方法一:伪元素叠加法(兼容性最佳) ```html <style> .container { position: relative; width: 800px; height: 600px; } .container::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: url("your-image.jpg") center/cover; opacity: 0.5; /* 透明度调节 0-1 */ z-index: 1; } .content { position: relative; z-index: 2; /* 内容置于遮罩层之上 */ } </style> <div class="container"> <div class="content">透明背景上的内容</div> </div> ``` **原理**:通过伪元素创建独立层实现背景透明[^3],避免影响内容元素 --- ### 方法二:CSS cross-fade()(现代浏览器支持) ```css .container { background-image: linear-gradient(rgba(255,255,255,0.5), rgba(255,255,255,0.5)), cross-fade(url(your-image.jpg), transparent 50%); background-size: cover; } ``` **特性**:原生CSS混合模式实现透明效果[^5],支持更复杂的混合操作 --- ### 方法三:背景渐变叠加(推荐方案) ```css .container { background: linear-gradient(rgba(255,255,255,0.3), rgba(255,255,255,0.3)), url(your-image.jpg) center/cover; } ``` **优势**:单层元素实现,通过渐变层调节透明度[^1],参数说明: - `rgba(255,255,255,0.3)`:白色半透明遮罩(第三位0.3为透明度) - 修改首参数为`rgba(0,0,0,0.3)`可创建黑色遮罩效果 --- ### 关键参数对照表 | 方法 | 透明度控制 | 兼容性 | 性能 | |-----------|-------------------|-----------|------| | 伪元素叠加法 | opacity属性 | IE9+ | 优 | | cross-fade | 百分比参数 | Chrome 85+ | 良 | | 渐变叠加 | rgba第四参数 | 全主流浏览器 | 优 | --- ### 注意事项 1. **避免直接使用opacity属性**:会导致子元素继承透明效果[^2] 2. **遮罩颜色选择**:白色遮罩会提亮背景,黑色遮罩会加深背景 3. **多浏览器测试**:建议使用autoprefixer工具处理CSS前缀 4. **片优化**:推荐使用WebP格式减少文件体积 --- **应用示例**(基于方法三优化): ```css .container { width: 800px; height: 600px; background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url(background.webp) center/cover; /* 兼容旧版浏览器 */ @supports not (background: cross-fade(#000, #fff, 50%)) { &::before { content: ""; position: absolute; background: rgba(0,0,0,0.5); /* ... */ } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值