在Windows编程中,写设置透明色,将两个图片重叠在一起的函数代码时,看不懂求解释~ 20
voidOverLapped(HDChdc,TCHAR*szBackGround,TCHAR*szForeGround,intleftVirtualBG,inttopVi...
void OverLapped(HDC hdc,TCHAR *szBackGround,TCHAR *szForeGround,int leftVirtualBG,int topVirtualBG)//虚拟表左上坐标
{
BITMAPFILEHEADER *pbmfhBG,*pbmfhFG;//位图表头首指针
BITMAPINFO *pbmiBG,*pbmiFG;//指向位图信息首的指针
static BYTE *pBitsBG,*pBitsFG,*pBG,*pFG;//指向图素位首的指针
int cxDibBG,cyDibBG,cxDibFG,cyDibFG,x,y;//备注:RECT结构里的成员类型均为long型
BYTE transR,transG,transB,newR,newG,newB;
RECT rectVirtual;
static TCHAR szForeGroundA[]=TEXT("CGDATA/sprite.bmp");
//透明色---------------------------------------------------绿
transR=0; //GetRValue(RGB(0,0,0));
transG=255; //GetGValue(RGB(0,255,0));
transB=0; //GetBValue(RGB(0,0,0));
//透明色---------------------------------------------------绿
pbmfhBG=LoadMyBitmap(szBackGround);
pbmiBG=Getpbmi(pbmfhBG);
pBitsBG=GetpBits(pbmfhBG);
cxDibBG=GetcxDib(pbmiBG);
cyDibBG=GetcyDib(pbmiBG);
pbmfhFG=LoadMyBitmap(szForeGroundA);
pbmiFG=Getpbmi(pbmfhFG);
pBitsFG=GetpBits(pbmfhFG);
cxDibFG=GetcxDib(pbmiFG);//cxDibFG单位:图素,一图素,三字节
cyDibFG=GetcyDib(pbmiFG);//cyDibFG单位:图素,一图素,三字节
//虚拟表格的大小与前景位图的一致,即完全合身
rectVirtual.left=leftVirtualBG;
rectVirtual.top=topVirtualBG;
rectVirtual.right=rectVirtual.left+(cxDibFG-1);//cxDibFG前景位图的宽(也是虚拟表格的宽)
rectVirtual.bottom=rectVirtual.top+(cyDibFG-1);//cyDibFG前景位图的高(也是虚拟表格的高)
pBG=pBitsBG;//pBitsBG指向背景图素的位的首地址
pFG=pBitsFG;//pBitsBG指向前景图素的位的首地址
for(y=rectVirtual.top;y<=rectVirtual.bottom;y++)//图素循环,一图素三位,一位即一字节
{
//pBG=((cyDibBG-1-y)*cxDibBG);//..............................................................这里不知道如何去写
//pFG=((cyDibFG-1-y)*cxDibBG);
for(x=rectVirtual.left;x<=rectVirtual.right;x++)//图素循环
{
newB=*pFG++;//位移动(字节移动,或者说,指向前景位图的"位(字节)的指针"的移动)
newG=*pFG++;
newR=*pFG++;
if(newB!=transB||newG!=transG||newR!=transR)//透明色为绿RGB(0.255.0)
{
pBG[0]=newB;
pBG[1]=newG;
pBG[2]=newR;
}
/*
else
{
pBG[0]=0;
pBG[1]=0;
pBG[2]=255;
}
*/
pBG+=3;//一图素,三字节,即三位
}
}
StretchDIBits(hdc,0,0,640,480,0,0,640,480,pBitsBG,pbmiBG,DIB_RGB_COLORS,SRCCOPY);
如果解释太长可以发我邮箱 waiboa123m@yeah.net
pBG=pBitsBG;
pFG=pBitsFG;
for(y=0;y<=cyDibFG-1;y++)
{
if(y!=0)pBG=pBG+3*(cxDibBG-cxDibFG);
for(x=0;x<=cxDibFG-1;x++)
{
newB=*pFG++;
newG=*pFG++;
newR=*pFG++;
if(newB!=transB||newG!=transG||newR!=transR)
{
*pBG++=newB;
*pBG++=newG;
*pBG++=newR;
}
else pBG+=3;
}
}
StretchDIBits(hdc,0,0,640,480,0,0,640,480,pBitsBG,pbmiBG,DIB_RGB_COLORS,SRCCOPY);
这是我修改的,也算是能显示了,只是如果加载一张白色的位图时,不仅仅是白色位图,会发现其中有杂点,怎么修改才能弄没杂点啊,有能力的朋友,帮帮忙喽,灰常感谢.. 展开
{
BITMAPFILEHEADER *pbmfhBG,*pbmfhFG;//位图表头首指针
BITMAPINFO *pbmiBG,*pbmiFG;//指向位图信息首的指针
static BYTE *pBitsBG,*pBitsFG,*pBG,*pFG;//指向图素位首的指针
int cxDibBG,cyDibBG,cxDibFG,cyDibFG,x,y;//备注:RECT结构里的成员类型均为long型
BYTE transR,transG,transB,newR,newG,newB;
RECT rectVirtual;
static TCHAR szForeGroundA[]=TEXT("CGDATA/sprite.bmp");
//透明色---------------------------------------------------绿
transR=0; //GetRValue(RGB(0,0,0));
transG=255; //GetGValue(RGB(0,255,0));
transB=0; //GetBValue(RGB(0,0,0));
//透明色---------------------------------------------------绿
pbmfhBG=LoadMyBitmap(szBackGround);
pbmiBG=Getpbmi(pbmfhBG);
pBitsBG=GetpBits(pbmfhBG);
cxDibBG=GetcxDib(pbmiBG);
cyDibBG=GetcyDib(pbmiBG);
pbmfhFG=LoadMyBitmap(szForeGroundA);
pbmiFG=Getpbmi(pbmfhFG);
pBitsFG=GetpBits(pbmfhFG);
cxDibFG=GetcxDib(pbmiFG);//cxDibFG单位:图素,一图素,三字节
cyDibFG=GetcyDib(pbmiFG);//cyDibFG单位:图素,一图素,三字节
//虚拟表格的大小与前景位图的一致,即完全合身
rectVirtual.left=leftVirtualBG;
rectVirtual.top=topVirtualBG;
rectVirtual.right=rectVirtual.left+(cxDibFG-1);//cxDibFG前景位图的宽(也是虚拟表格的宽)
rectVirtual.bottom=rectVirtual.top+(cyDibFG-1);//cyDibFG前景位图的高(也是虚拟表格的高)
pBG=pBitsBG;//pBitsBG指向背景图素的位的首地址
pFG=pBitsFG;//pBitsBG指向前景图素的位的首地址
for(y=rectVirtual.top;y<=rectVirtual.bottom;y++)//图素循环,一图素三位,一位即一字节
{
//pBG=((cyDibBG-1-y)*cxDibBG);//..............................................................这里不知道如何去写
//pFG=((cyDibFG-1-y)*cxDibBG);
for(x=rectVirtual.left;x<=rectVirtual.right;x++)//图素循环
{
newB=*pFG++;//位移动(字节移动,或者说,指向前景位图的"位(字节)的指针"的移动)
newG=*pFG++;
newR=*pFG++;
if(newB!=transB||newG!=transG||newR!=transR)//透明色为绿RGB(0.255.0)
{
pBG[0]=newB;
pBG[1]=newG;
pBG[2]=newR;
}
/*
else
{
pBG[0]=0;
pBG[1]=0;
pBG[2]=255;
}
*/
pBG+=3;//一图素,三字节,即三位
}
}
StretchDIBits(hdc,0,0,640,480,0,0,640,480,pBitsBG,pbmiBG,DIB_RGB_COLORS,SRCCOPY);
如果解释太长可以发我邮箱 waiboa123m@yeah.net
pBG=pBitsBG;
pFG=pBitsFG;
for(y=0;y<=cyDibFG-1;y++)
{
if(y!=0)pBG=pBG+3*(cxDibBG-cxDibFG);
for(x=0;x<=cxDibFG-1;x++)
{
newB=*pFG++;
newG=*pFG++;
newR=*pFG++;
if(newB!=transB||newG!=transG||newR!=transR)
{
*pBG++=newB;
*pBG++=newG;
*pBG++=newR;
}
else pBG+=3;
}
}
StretchDIBits(hdc,0,0,640,480,0,0,640,480,pBitsBG,pbmiBG,DIB_RGB_COLORS,SRCCOPY);
这是我修改的,也算是能显示了,只是如果加载一张白色的位图时,不仅仅是白色位图,会发现其中有杂点,怎么修改才能弄没杂点啊,有能力的朋友,帮帮忙喽,灰常感谢.. 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询