GDI,关于alpha位图

GDI, About alpha bitmap

本文关键字:位图 alpha 关于 GDI      更新时间:2023-10-16

我的问题是:选中一个alpha位图后放入内存DC,然后使用DrawText函数,但文本无法显示。

代码如下:

CDC memDC;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc,64,100);
CBitmap *oldmemBitmap=(CBitmap*)memDC.SelectObject(&memBitmap);
CDC memDC1;
memDC1.CreateCompatibleDC(&dc);
//m_bitmap has alpha channel   64*64
CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap);
memDC.BitBlt(0, 0, 64, 64, &memDC1, 0, 0, SRCCOPY);

CString str = _T("TEST");
memDC.DrawText(str,str.GetLength(),CRect(0,64,64,36),DT_CENTER|DT_WORDBREAK|DT_NOCLIP);
memDC.SelectObject(oldmemBitmap);
BITMAP bmpData;
memBitmap.GetBitmap(&bmpData);
CImageList imageList;
imageList.Create(bmpData.bmWidth, bmpData.bmHeight, ILC_COLOR32|ILC_MASK, 0, 1);
imageList.Add(&memBitmap, RGB(0, 0, 0));
POINT pt = {0, 0};
imageList.Draw(&dc, 0, pt, ILD_NORMAL);

m_bitmap可以正确显示,但"TEST"字符串不能。当我评论memDC.BitBlt(…)时,可以显示"TEST"字符串。为什么?

我的第一个猜测是:检查上下文中选择的设备字体、颜色和背景颜色。

DrawText函数使用设备上下文选定的字体、文本颜色和背景颜色来绘制文本请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspx

也许由于某种原因,你的颜色与背景颜色相同,或者类似的原因。我排除了位图的alpha通道指定总透明度的可能性。在这种情况下,文本也不会出现。

问题中没有足够的信息来明确回答发生了什么,但我可以进行一些有根据的猜测。

除了极少数例外,GDI不处理、尊重或保留alpha通道。当你这样做时:

CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap);

发生了转换,因为在兼容的DC中不能有带alpha通道的位图。("兼容DC"是一个糟糕的术语。它实际上是一个依赖于设备的DC。)

BitBlt将现在不透明的位图复制到另一个DC。现在你在memDC中有一个不透明的位图——我猜它大部分是黑色的。

然后你在上面画文本。我猜文本也是黑色的,所以你现在有黑色背景上的黑色文本。

然后将位图添加到图像列表中,告诉图像列表屏蔽所有黑色像素,包括文本和背景。因此,您看不到文本。你也看不到背景,但我怀疑你没想到会看到背景,因为alpha通道(实际上已经丢失)。

当你注释掉BitBlt时,你会得到一个未初始化的背景(可能不是黑色的),并在上面绘制黑色文本。然后你将其添加到图像列表中,屏蔽黑色。文本看起来是可见的,只是因为它与不透明的背景形成对比。

这就回答了"为什么?"。我想现在你想知道该怎么办。为此,我们需要更多关于你希望发生什么的信息。