|
|
发表于 2004-12-19 16:13:00
|
显示全部楼层
Re:谁能给一个Alpha混合的代码``简单一点的就行了``谢谢`
你把下面的代码拷过去看看,然后只要调用Alpha函数就可以实现透明处理了,代码有说明
//*********************透明处理*******
bool Alpha(LPDIRECTDRAWSURFACE7 lpDDSbMap, //背景图片
LPDIRECTDRAWSURFACE7 lpDDSMap, //目标图片
LPDIRECTDRAWSURFACE7 lpDDSbuffer,//用于存放混合后的图象,即你想要最后效果图
int x,int y,int w,int h, //透明处理的区域。w,h分别为宽,高
float alpha) //透明度,0为透明,1为不透明
{
DDSURFACEDESC2 ddsd1;
DDSURFACEDESC2 ddsd2;
DDSURFACEDESC2 ddsd3;
ZeroMemory(&ddsd1,sizeof(ddsd1));
ddsd1.dwSize=(sizeof(ddsd1));
ZeroMemory(&ddsd2,sizeof(ddsd2));
ddsd2.dwSize=(sizeof(ddsd2));
ZeroMemory(&ddsd3,sizeof(ddsd3));
ddsd3.dwSize=(sizeof(ddsd3));
if ((lpDDSMap->Lock(NULL,&ddsd1,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK)&&
(lpDDSbMap->Lock(NULL,&ddsd2,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK)&&
(lpDDSbuffer->Lock(NULL,&ddsd3,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)==DD_OK))
{
for(int y0=0;y0<h;y0++){
for(int x0=0;x0<w;x0++){
USHORT color1=ReadPixel16(x0,y0,(USHORT*)ddsd1.lpSurface,(int)ddsd1.lPitch);
USHORT color2=ReadPixel16(x+x0,y+y0,(USHORT*)ddsd2.lpSurface,(int)ddsd2.lPitch);
USHORT color=AlphaPixel15(color1,color2,alpha);
PlotPixel16(x+x0,y+y0,color,(USHORT*)ddsd3.lpSurface,(int)ddsd3.lPitch>>1);
}}
lpDDSMap->Unlock(NULL);//解锁
lpDDSbMap->Unlock(NULL);//解锁
lpDDSbuffer->Unlock(NULL);//解锁
}
else return FALSE;
return TRUE;
}
inline void PlotPixel16(int x,int y,USHORT color,USHORT* buffer,int nPitch)
{
buffer[y*nPitch+x]=color;
}
inline USHORT ReadPixel16(int x,int y, USHORT* buffer,int nPitch)
{
return buffer[y*(nPitch>>1)+x];
}
inline USHORT AlphaPixel16(USHORT color1,USHORT color2)
{
UCHAR r,g,b;
r=(((color1&0xf800)>>11)+((color2&0xf800)>>11))>>1;
g=(((color1&0x07e0)>>5)+((color2&0x07e0)>>5))>>1;
b=((color1&0x001f)+(color2&0x001f))>>1;
return RGB_16BIT565(r,g,b);
}
inline USHORT AlphaPixel15(USHORT color1,/*透明图*/
USHORT color2,/*背景图*/
float pct/*不透明度*/)
{
if(pct>1)pct=(float)1;
UCHAR r,g,b;
r=(UCHAR)((float)((color1&0xf800)>>11)*pct+
(float)((color2&0xf800)>>11)*(1-pct));
g=(UCHAR)((float)((color1&0x07e0)>>5)*pct+
(float)((color2&0x07e0)>>5)*(1-pct));
b=(UCHAR)((float)(color1&0x001f)*pct+
(float)(color2&0x001f)*(1-pct));
return RGB_16BIT565(r,g,b);
} |
|