在阅读Forger的"Transparent Bitmaps" 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);
我最困惑的是最后一行,如何使用按位AND,位图图像的白色在结果中消失,而黑色保留在那里。 (SRCAND的文档称它“通过使用布尔AND运算符组合源矩形和目标矩形的颜色。”)
总的来说,我想知道,在按位级别,窗口中的句柄与设备上下文和白色/黑色图像之间的比较是什么导致白色在结果中消失而黑色留下来?
我认为会发生的是,在开始时,设备上下文的句柄仅包含0。所以无论什么颜色都是AND,用0做AND并不会导致0,所以最后一切都是黑色的,结果是黑色正方形。
答案 0 :(得分:2)
SRCAND的文档说它“结合了源和颜色的颜色 目标矩形使用布尔AND运算符。“
更确切地说,使用按位 AND运算符。
目标像素始终为灰色(假设RGB值为0x7F7F7F
)。对于源图像中的白色像素,对于黑色像素0xFFFFFF
,像素值将为0x000000
。
如果源像素为黑色:
,则会产生以下等式DWORD result = 0x000000 & 0x7F7F7F;
结果为0x000000
(黑色),因为AND仅保留两个操作数中1
的位。
如果源像素为白色,我们有以下等式:
DWORD result = 0xFFFFFF & 0x7F7F7F;
结果为0x7F7F7F
(灰色),因为这些是两个操作数中1
的位。