Win32 C++的BitBlt光栅方法和透明度

3

我最近问了一个关于这个问题的问题,明白了答案,但是无法将其翻译成代码。在另一天折腾和修复泄漏后,我真的无法想出解决方法。

这有点不同,我所需要做的就是获取地图位图下方的背景位图。What I have

HDC hdc = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdc);
HDC hdcMem2 = CreateCompatibleDC(hdc);
ReleaseDC(hWnd, hdc);

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.hbmBackground);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem, 0, 0, SRCCOPY);       

HBITMAP hbmOld2 = (HBITMAP)SelectObject(hdcMem2, bitmap.hbmMap);
BitBlt(buffer.getBufferDC(), 1, 1, WINDOW_WIDTH, WINDOW_HEIGHT, hdcMem2, 0, 0, SRCPAINT); 

SelectObject(hdcMem2, hbmOld2);

我的问题是如何将...创建内存数据集以保存栅格操作的结果。我完全无法理解这一点,希望能得到帮助。

谢谢。

1个回答

5

这个问题中最难的部分可能是中间的矩形。掩码中的其他白色区域是背景应该透过的地方,但在矩形内部,你需要让背景不要显示出来而保留白色。

暂时先假设我们可以让那些部分成为不同的颜色。对于透明部分(即背景应该显示的部分),我们使用什么颜色并不重要,只要它是独特的即可。现在我将假设它是一个 RGB 值为 254、254、254 的颜色——代码不会将其误认为是纯白色(255、255、255),但通常在视觉上难以区分。

有了这一点,任务就变得非常简单:我们可以使用 TransparentBlt 来处理透明度,因此你可以使用 BitBlt 将背景位块传输到目标位置,然后使用 TransparentBlt 将掩码位块传输到那个目标位置。稍微简化一下(暂时忽略我们不太关注的参数),代码看起来像这样:

HDC mask, background, combined;

mask =       CreateCompatibleDC(screen);
background = CreateCompatibleDC(screen);
combined =   CreateCompatibleDC(screen);

HBITMAP mask_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_MASK));
HBITMAP back_bmp = LoadBitmap(MAKEINTRESOURCE(IDB_BKGND));
HBITMAP result = CreateCompatibleBitmap(screen);

mask_original = Selectobject(mask, mask_bmp);
back_original = SelectObject(background, back_bmp);
combined_original = SelectObject(combined, result);

BitBlt(background, result, SRCCOPY);
TransparentBlt(mask, result, RGB(254, 254, 254));

BitBlt(result, screen, SRCCOPY);

SelectObject(mask, mask_original);
SelectObject(background, back_original);
SelectObject(combined, combined_original);

DeleteDC(mask);
DeleteDC(background);
DeleteDC(combined):
DeleteObject(result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接