在阅读了Forger的Windows API的“透明位图”教程之后,我很难理解SRCAND的Bitblt()函数。
根据教程,我用SRCAND绘制单个黑白位图的部分代码如下所示。
BITMAP bm;
RECT rcClient;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps); //hwnd = handle to current window
HDC hdcMem = CreateCompatibleDC(hdc);
GetObject(g_hbmBall, sizeof(bm), &bm); //g_hbmBall = handle to bitmap object
GetClientRect(hwnd, &rcClient);
FillRect(hdc, &rcClient, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
SelectObject(hdcMem, g_hbmBall);
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCAND);
我感到困惑的是最后一行,如何按位与,结果中的位图图像的白色消失了,而黑色则停留在那里。(SRCAND的文档说它“通过使用布尔AND运算符来组合源矩形和目标矩形的颜色。”)
总体而言,我想知道按位层次上,窗口中的设备到设备上下文的句柄与白/黑图像之间的比较是什么,导致白色在结果中消失,而黑颜色仍然存在?
我以为会发生的事情是,一开始,设备上下文的句柄仅包含0。因此,无论将哪种颜色进行AND运算,与0进行AND运算始终会产生0,因此最终所有内容均为黑色,从而产生黑色正方形。
SRCAND的文档说:“通过使用布尔AND运算符将源矩形和目标矩形的颜色组合在一起。”
更确切地说,使用按位AND运算符。
目标像素始终为灰色(假设RGB值为0x7F7F7F
)。对于源图像中的白色像素,像素值将为0xFFFFFF
黑色像素0x000000
。
如果源像素为黑色,则将导致以下等式:
DWORD result = 0x000000 & 0x7F7F7F;
其结果是0x000000
(黑色),因为,只保留这是位1
在两个操作数。
如果源像素是白色,我们具有以下等式:
DWORD result = 0xFFFFFF & 0x7F7F7F;
其结果是0x7F7F7F
(灰色),因为这些是位1
在两个操作数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句