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
相关产品推荐
相关产品推荐

