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

龙侠X

在阅读了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,因此最终所有内容均为黑色,从而产生黑色正方形。

zett42

SRCAND的文档说:“通过使用布尔AND运算符将源矩形和目标矩形的颜色组合在一起。”

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

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

如果源像素为黑色,则将导致以下等式

DWORD result = 0x000000 & 0x7F7F7F;

其结果是0x000000(黑色),因为,只保留这是位1两个操作数。

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

DWORD result = 0xFFFFFF & 0x7F7F7F;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章