如何让一张图片变成半透明即可显示图像后面的图像。(100分)

  • 主题发起人 主题发起人 delphiplayer
  • 开始时间 开始时间
D

delphiplayer

Unregistered / Unconfirmed
GUEST, unregistred user!
如何让一张图片变成半透明即可显示图像后面的图像。
 
windows.AlphaBlend
windows.AlphaDIBBlend()
 
BOOL CDIB::CompoundDIB(HBITMAP hDestBitmap,int nXDest,int nYDest,
int Width,int Height,HBITMAP hSrcBitmap,int nXSrc,int nYSrc,
UINT nTrans,BOOL bTrans)
{
if (hDestBitmap==NULL || hSrcBitmap==NULL)
return false;
if (CBitmap::FromHandle (hDestBitmap)==NULL ||
CBitmap::FromHandle(hSrcBitmap)==NULL)
return false;
BITMAP Srcb,Decb;
GetObject(hSrcBitmap,sizeof(Srcb),&Srcb);
if (Srcb.bmBitsPixel <=8)
return false;
ASSERT(Srcb.bmBits);//必须有数据
GetObject(hDestBitmap,sizeof(Decb),&amp;Decb);
if (Decb.bmBitsPixel <=8)
return false;
ASSERT(Decb.bmBits);//必须有数据
// Create hMask //
HBITMAP hMask=CreateDIBCompatibleBitmap (Srcb.bmWidth,Srcb.bmHeight,24);
CDC dc;
dc.CreateCompatibleDC (NULL);
SelectObject(dc.GetSafeHdc (),hMask);
if (!bTrans)
{
HBITMAP hBW=BWBlt(hSrcBitmap);
CDC dc1;
dc1.CreateCompatibleDC (NULL);
SelectObject(dc1.GetSafeHdc(),hBW);
dc.BitBlt(0,0,Srcb.bmWidth,Srcb.bmHeight,&amp;dc1,0,0,SRCCOPY);
dc1.DeleteDC();
DeleteObject(hBW);
}
else
{
dc.FillSolidRect (0,0,Srcb.bmWidth,Srcb.bmHeight,RGB(nTrans,nTrans,nTrans));
}
dc.DeleteDC ();
BITMAP Maskb;
GetObject(hMask,sizeof(Maskb),&amp;Maskb);
// End Create hMask //
if (nXDest >= Decb.bmWidth || nYDest >= Decb.bmHeight
|| nXSrc >= Srcb.bmWidth || nYSrc >=Srcb.bmHeight)
return false;
int width1,width2,height1,height2;
width1=Decb.bmWidth-nXDest;height1=Decb.bmHeight-nYDest;
width2=Srcb.bmWidth-nXSrc;height2=Srcb.bmHeight-nYSrc;
width1=width1 >= width2? width2:width1;
height1=height1 >= height2? height2:height1;
Width=Width >= width1? width1:Width;
Height=Height >= height1? height1:Height;
// Combin Bitmap //
int xstart,ystart;
for (ystart=0;ystart < Height; ystart++)
{
for (xstart=0; xstart < Width*3; xstart++)
{
int DestPos=(Decb.bmHeight-nYDest-ystart-1)*Decb.bmWidthBytes+nXDest*3;
int SrcPos=(Srcb.bmHeight-nYSrc-ystart-1)*Srcb.bmWidthBytes+nXSrc*3;
*((LPBYTE)Decb.bmBits+DestPos+xstart)=(*((LPBYTE)Decb.bmBits+DestPos+xstart)*
(255-*((LPBYTE)Maskb.bmBits+SrcPos+xstart))+*((LPBYTE)Srcb.bmBits+SrcPos+xstart)*
*((LPBYTE)Maskb.bmBits+SrcPos+xstart))/255;
}
}
DeleteObject(hMask);
return true;
}
 
多谢两位,特别感谢Takashiki
 
后退
顶部