Q
QSmile
Unregistered / Unconfirmed
GUEST, unregistred user!
我有两个位图,BmpA 与 BmpB 吧。
它们都是 256色的 Bitmap 。两个图的调色板是相同的。
我想把 BmpB 以透明背景的方式 BitBlt 到 BmpA 上。
我是这样做的。(看了网上的VC代码)
先建一个 MaskBmp 单色,与BmpB 一样大小 如:
SetBkColor(BitmapB.Canvas.Handle,$000000);
MaskBmp.Handle := CreateBitmap(m_Bitmap.Width,m_Bitmap.Height,1,1,nil);
BitBlt(MaskBmp.Canvas.Handle ,
0,0,MaskBmp.Width,MaskBmp.Height ,
BitmapB.Canvas.Handle ,0,0,SRCCOPY);
再向BmpA 作画
如:
SetBkColor(destDC,$ffffff);
SetTextColor(destDC,$000000);
StretchBlt(destDC,x,y,w,h,BitmapB.Canvas.Handle
,0,0,BitmapB.Width,Bitmap.Height ,SRCINVERT);
StretchBlt(destDC,x,y,w,h,MaskBmp.Canvas.Handle
,0,0,BitmapB.Width,BitmapB.Height ,SRCAND);
StretchBlt(destDC,x,y,w,h,BitmapB.Canvas.Handle
,0,0,BitmapB.Width,BBitmap.Height ,SRCINVERT);
也就是,先把 BmpB 以 SRCINVERT 画到 BmpA 上,
再把 MaskBmp 以SRCAND 画到 BmpA 上,
再把 BmpB 以 SRCINVERT 画到 BmpA 上。
在 24bit 位图下没问题,再在256色就不行了。
它们都是 256色的 Bitmap 。两个图的调色板是相同的。
我想把 BmpB 以透明背景的方式 BitBlt 到 BmpA 上。
我是这样做的。(看了网上的VC代码)
先建一个 MaskBmp 单色,与BmpB 一样大小 如:
SetBkColor(BitmapB.Canvas.Handle,$000000);
MaskBmp.Handle := CreateBitmap(m_Bitmap.Width,m_Bitmap.Height,1,1,nil);
BitBlt(MaskBmp.Canvas.Handle ,
0,0,MaskBmp.Width,MaskBmp.Height ,
BitmapB.Canvas.Handle ,0,0,SRCCOPY);
再向BmpA 作画
如:
SetBkColor(destDC,$ffffff);
SetTextColor(destDC,$000000);
StretchBlt(destDC,x,y,w,h,BitmapB.Canvas.Handle
,0,0,BitmapB.Width,Bitmap.Height ,SRCINVERT);
StretchBlt(destDC,x,y,w,h,MaskBmp.Canvas.Handle
,0,0,BitmapB.Width,BitmapB.Height ,SRCAND);
StretchBlt(destDC,x,y,w,h,BitmapB.Canvas.Handle
,0,0,BitmapB.Width,BBitmap.Height ,SRCINVERT);
也就是,先把 BmpB 以 SRCINVERT 画到 BmpA 上,
再把 MaskBmp 以SRCAND 画到 BmpA 上,
再把 BmpB 以 SRCINVERT 画到 BmpA 上。
在 24bit 位图下没问题,再在256色就不行了。