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