You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TransparentBlt()文档是否存在错误?其跨Windows版本行为如何?

关于TransparentBlt()函数文档描述与实际行为的矛盾及版本兼容性疑问

微软GDI函数TransparentBlt()的文档中有如下描述:

TransparentBlt函数支持所有格式的源位图。但对于32 bpp位图,它仅复制Alpha值。

上述描述是否存在错误?

以下代码显示TransparentBlt()的实际行为与文档描述矛盾——它会将非透明像素的Alpha通道值置零,且完全不复制源透明像素的任何通道(这是合理行为):

#include <windows.h>

void Test_TransparentBlt(void)
{
    BITMAPINFO bmi = { {sizeof(BITMAPINFOHEADER), 2, 1,1,32,BI_RGB,0,0,0,0,0} };
    PDWORD PixelsSrc;
    HBITMAP hBmpSrc = CreateDIBSection(0, &bmi, DIB_RGB_COLORS, (PVOID*)&PixelsSrc, NULL, 0);
    PixelsSrc[0] = 0xEE555555; PixelsSrc[1] = 0xFFAAAAAA;

    PDWORD PixelsDst;
    HBITMAP hBmpDst = CreateDIBSection(0, &bmi, DIB_RGB_COLORS, (PVOID*)&PixelsDst, NULL, 0);
    PixelsDst[0] = 0xCC222222; PixelsDst[1] = 0xDD333333;
    
    HDC hDCsrc = CreateCompatibleDC(NULL);
    HDC hDCdst = CreateCompatibleDC(NULL);
    SelectObject(hDCsrc, hBmpSrc);
    SelectObject(hDCdst, hBmpDst);
    
    printf("Src: %08X, %08X\n", PixelsSrc[0], PixelsSrc[1]);    
    printf("Dst: %08X, %08X\n", PixelsDst[0], PixelsDst[1]);
    TransparentBlt(hDCdst, 0, 0, 2, 1, hDCsrc, 0, 0, 2, 1, 0x00555555);
    printf("DST: %08X, %08X\n", PixelsDst[0], PixelsDst[1]);
}

代码实际输出:

Src: EE555555, FFAAAAAA
Dst: CC222222, DD333333
DST: CC222222, 00AAAAAA

若按文档描述复制源非透明像素的Alpha值,输出应如下:

Src: EE555555, FFAAAAAA
Dst: CC222222, DD333333
DST: CC222222, FFAAAAAA

注:Alpha通道编码在像素数据的最高有效位(DWORD的高位字节)。

请问该函数是否在所有Windows版本中均表现出此行为?


内容的提问来源于Stack Exchange,提问作者George Robinson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:53:10