c++ - AlphaBlend 生成不正确的颜色

标签 c++ windows winapi bitmap alphablending

几十年来我一直设法避免使用 Windows GDI,现在我要付出代价了。以下 C++ 代码不会生成正确的颜色。它只是应该用白色填充一个窗口,然后对单个位图进行 alpha 混合。所有的 alpha 都是位图中的每像素 alpha。

// Create a memory DC
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmMem = CreateCompatibleBitmap(hdc, cxWnd, cyWnd);
SelectObject(hdcMem, hbmMem);

// White-fill the BG
FillRect(hdcMem, &rectWnd, static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)));

// Alpha blend the bitmap into the memory DC
HDC hdcSrc = CreateCompatibleDC(hdcMem);
HBITMAP hbmOld = static_cast<HBITMAP>(SelectObject(hdcSrc, hbm));
BLENDFUNCTION bfn = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(hdcMem, x, y, cxBmp, cyBmp, hdcSrc, 0, 0, cxBmp, cyBmp, bfn);
SelectObject(hdcSrc, hbmOld);
DeleteDC(hdcSrc);

// Blit the memory DC to the screen
BitBlt(hdc, 0, 0, cxWnd, cyWnd, hdcMem, 0, 0, SRCCOPY);

我已验证所有变量值都正确,并且 hbm 中的位图具有正确的像素颜色和 alpha。

结果显示了许多错误的颜色,例如,具有低 alpha 的蓝色像素应该是淡蓝色,但实际上是深红色。具有高 alpha 的像素更接近它们应有的状态。

感谢任何帮助。 TIA。

最佳答案

答案来自评论中的提示:每个像素中的每个颜色 channel 都必须在混合之前预乘 alpha。

get DIB bits
for each pixel
  r = r * alpha / 255
  g = g * alpha / 255
  b = b * alpha / 255
set DIB bits

MS 并不容易找到这些东西。在我能找到的唯一 alpha 混合示例中没有任何提示:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd183353(v=vs.85).aspx

关于c++ - AlphaBlend 生成不正确的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595717/

相关文章:

C++实现组合和访问者模式的例子

c++ - 具有缩放拉伸(stretch)纵横比的 glm 旋转

java - Client SocketInputStream.close() 导致更多的资源消耗?

c++ - 使用程序集调试资源中的字符串

数组中的 C++ 相等运算符

c++ - Visual Studio 2010 - 在不同的构建配置之间保留项目属性?

.net - 什么是 ASP.NET 应用程序服务器?

windows - 从 Windows 批处理脚本中的文件中读取值

c++ - 使用 strcpy() 获取 char* 的一部分会导致程序崩溃

C++ 并将枚举值写入 Windows 注册表