【问题标题】:How does Bitblt() work with SRCAND?Bitblt() 如何与 SRCAND 一起使用?
【发布时间】:2017-05-27 17:46:27
【问题描述】:

在阅读了 Forger 的 Windows API 的 "Transparent Bitmaps" 教程后,我在按位理解 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。所以不管是什么颜色,用 0 做 AND 总是得到 0,所以最后一切都是黑色的,结果是一个黑色的方块。

【问题讨论】:

  • 为了透明度,我们需要使用AlphaBlend
  • AlphaBlend 很聪明,但速度要慢 4 倍(我只是在调整绘图功能的性能......)。使用 GDI+ 更智能、更慢

标签: winapi


【解决方案1】:

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

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

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

如果源像素为黑色,则结果如下:

DWORD result = 0x000000 & 0x7F7F7F;

结果是 0x000000(黑色),因为 AND 只在 both 操作数中保留 1 位。

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

DWORD result = 0xFFFFFF & 0x7F7F7F;

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

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2016-08-27
    • 2021-04-24
    • 2016-05-29
    相关资源
    最近更新 更多