Bitblt()如何与SRCAND一起使用?

时间:2017-05-27 17:46:27

标签: winapi

在阅读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运算符组合源矩形和目标矩形的颜色。”)

这是我在视觉上看到的: enter image description here

总的来说,我想知道,在按位级别,窗口中的句柄与设备上下文和白色/黑色图像之间的比较是什么导致白色在结果中消失而黑色留下来?

我认为会发生的是,在开始时,设备上下文的句柄仅包含0。所以无论什么颜色都是AND,用0做AND并不会导致0,所以最后一切都是黑色的,结果是黑色正方形。

1 个答案:

答案 0 :(得分:2)

  

SRCAND的文档说它“结合了源和颜色的颜色   目标矩形使用布尔AND运算符。“

更确切地说,使用按位 AND运算符。

目标像素始终为灰色(假设RGB值为0x7F7F7F)。对于源图像中的白色像素,对于黑色像素0xFFFFFF,像素值将为0x000000

如果源像素为黑色

,则会产生以下等式
DWORD result = 0x000000 & 0x7F7F7F;

结果为0x000000(黑色),因为AND仅保留两个操作数中1的位。

如果源像素为白色,我们有以下等式:

DWORD result = 0xFFFFFF & 0x7F7F7F;

结果为0x7F7F7F(灰色),因为这些是两个操作数中1的位。