*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: flyue E-mail:ljypct@21cn.com QQ:406088125
*/ 时间: 2007-8-3 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
基于DirectDraw的AlphaBlent半透明混色实现代码:
//获得Direct Surface上的一点像素值
void DDGetPixel(BYTE *bits,int X,int Y,int Pitch,int Depth,BYTE *Pixel)
{
int pos=Pitch*Y+Depth*X;
for(int i=0;i<Depth;i++)
Pixel[i]=bits[pos+i];
}
//设置Direct Surface上的一点像素值
void DDSetPixel(BYTE *bits,int X,int Y,int Pitch,int Depth,BYTE *Pixel)
{
int pos=Pitch*Y+Depth*X;
for(int i=0;i<Depth;i++)
bits[pos+i]=Pixel[i];
}
//Alpha Blent函数
void AlphaBlent(BYTE *Target,int X,int Y,BYTE *Source,int SX,int SY,int Width,int Height,int Pitch,int Depth,BYTE *Col,double Alpha)
{
int TrnsX;
int TrnsY;
BYTE RGB1[5],RGB2[5],RGB3[5];
for(TrnsY=Y;TrnsY<=Y+Height-1;TrnsY++)
{
for(TrnsX=X;TrnsX<=X+Width-1;TrnsX++)
{
DDGetPixel(Source,TrnsX+SX-X,TrnsY+SY-Y,Pitch,Depth,RGB2);
if((RGB2[0]!=Col[0])||(RGB2[1]!=Col[1])||(RGB2[2]!=Col[2]))
{
double Alpha2=1-Alpha;
int Red2=RGB2[2];
int Green2=RGB2[1];
int Blue2=RGB2[0];
DDGetPixel(Target,TrnsX+X,TrnsY+Y,Pitch,Depth,RGB1);
int Red=RGB1[2];
int Green=RGB1[1];
int Blue=RGB1[0];
double RedF=Red*Alpha+Red2*Alpha2;
double GreenF=Green*Alpha+Green2*Alpha2;
double BlueF=Blue*Alpha+Blue2*Alpha2;
RGB3[0]=(BYTE)BlueF;
RGB3[1]=(BYTE)GreenF;
RGB3[2]=(BYTE)RedF;
DDSetPixel(Target,TrnsX+X,TrnsY+Y,Pitch,Depth,RGB3);
}
}
}
}
说明:要求Direct颜色设置为24,
ddsd为一个DDSURFACEDESC结构,
Pitch可以用lpDDSPic->Lock(&ddsd,...)来获得ddsd->lPitch,
Depth=ddsd.ddpfPixelFormat.dwRGBBitCount/8;