【问题标题】:How do I do bitmap transparency on an existing color?如何对现有颜色进行位图透明度?
【发布时间】:2026-02-03 13:40:01
【问题描述】:

我正在使用 Win32。我发现 here 如果你使用:

BitBlt(hdc, 0, 0, 32, 32, hdcMem, 0, 0, SRCAND); // hdc has mask in it
BitBlt(hdc, 0, 0, 32, 32, hdcMem, 0, 0, SRCPAINT);`// hdc has regular image in it

您可以创建位图透明度。我的问题是,这取决于目标位置上的 hdc 已经为空的事实。我的不是,所以代码会擦除(变黑)现有图像的一部分。如何将透明位图复制到已绘制内容的区域?

我尝试将掩码和图像都发送到 1000、1000 - hdc 中没有绘制任何内容,然后使用 BitBlt() 中的 SRCCOPY 将结果从 hdc 复制到 hdc。但要么在 1000、1000 时没有提取任何内容,要么没有正确复制回来。

【问题讨论】:

    标签: c++ winapi bitmap transparency


    【解决方案1】:

    您可以改用TransparentBlt

    BOOL TransparentBlt(
      _In_  HDC hdcDest,
      _In_  int xoriginDest,
      _In_  int yoriginDest,
      _In_  int wDest,
      _In_  int hDest,
      _In_  HDC hdcSrc,
      _In_  int xoriginSrc,
      _In_  int yoriginSrc,
      _In_  int wSrc,
      _In_  int hSrc,
      _In_  UINT crTransparent
    );
    

    如果源位图的背景颜色为黑色(#000000),只需将crTransparent 设置为RGB(0,0,0) 即可。

    【讨论】:

    • 天哪,这太完美了!太感谢了!我必须包含 Msimg32.lib 才能正常工作,但它现在可以正常工作了。