AlphaBlending






3.24/5 (13投票s)
2005年12月12日

57379

1118
本文档演示了如何混合两个位图。
引言
这段代码片段展示了如何使用线性插值公式来混合两个位图。
背景
- 线性插值公式
Let 0 <= a < 1, RGBblended = a * RGBfirst + (1 - a) * RGBsecond
- Amol Kakhandki 的 GetBitmapBits 和 SetBitmapBits 函数
使用代码
这里有一个函数,可以在 OnPaint()
或 OnDraw()
中使用。实际上,在示例项目中,我没有准备一个函数,而是直接将代码放在 OnPaint()
方法中。在这个函数中,新的混合位图被放置在一个第二个位图上。如果需要,您可以实现代码并创建一个第三个位图来存放新的位图。
第二个参数,double blend
,必须在 [0,1) 范围内。这个数字用于第一个位图,第二个数字是 1-blend
用于第二个位图。
void CAlphaBlendingDlg::AlphaBlend(CDC *pDC, double blend) { BITMAP bmpX,bmpY; CBitmap bmp1,bmp2; bmp2.LoadBitmap(IDB_BITMAP2); bmp1.LoadBitmap(IDB_BITMAP1); bmp1.GetBitmap(&bmpX); UINT* bmpBuffer=(UINT*) GlobalAlloc(GPTR, bmpX.bmWidthBytes * bmpX.bmHeight); bmp1.GetBitmapBits(bmpX.bmWidthBytes * bmpX.bmHeight, bmpBuffer); bmp2.GetBitmap(&bmpY); UINT* bmpBuffer2=(UINT*) GlobalAlloc(GPTR, bmpY.bmWidthBytes * bmpY.bmHeight); bmp2.GetBitmapBits(bmpY.bmWidthBytes * bmpY.bmHeight, bmpBuffer2); int nSize = bmpY.bmWidth * bmpY.bmHeight; for (int i = 0; i < nSize; i++) { int abR = (int) (GetR(bmpBuffer[i]) * blend + (1-blend) * GetR(bmpBuffer2[i])); int abG = (int) (GetG(bmpBuffer[i]) * blend + (1-blend) * GetG(bmpBuffer2[i])); int abB = (int) (GetB(bmpBuffer[i]) * blend + (1-blend) * GetB(bmpBuffer2[i])); bmpBuffer2[i] = RGB(abB, abG, abR); } bmp2.SetBitmapBits(bmpX.bmWidthBytes * bmpX.bmHeight, bmpBuffer2); CDC memdc; memdc.CreateCompatibleDC(pDC); memdc.SelectObject(bmp2); pDC->BitBlt(10,10,bmpX.bmWidthBytes, bmpX.bmHeight, &memdc, 0, 0, SRCCOPY); GlobalFree((HGLOBAL)bmpBuffer); GlobalFree((HGLOBAL)bmpBuffer2); memdc.DeleteDC(); }