GDI,关于alpha位图
GDI, About alpha bitmap
我的问题是:选中一个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时,你会得到一个未初始化的背景(可能不是黑色的),并在上面绘制黑色文本。然后你将其添加到图像列表中,屏蔽黑色。文本看起来是可见的,只是因为它与不透明的背景形成对比。
这就回答了"为什么?"。我想现在你想知道该怎么办。为此,我们需要更多关于你希望发生什么的信息。
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- 如何从路径字符串加载Gdiplus::位图
- 在C++中使用Gdiplus创建透明位图
- 用C++压缩内存中的位图
- 保存的 Gdiplus::位图始终具有 Alpha 通道 (RGBA/ARGB)
- 将Alpha通道添加到位图或将位图转换为32位
- GDI,关于alpha位图
- 在8位位图中处理alpha通道的好方法?-OpenGL-C++
- NDK - 从ARGB_8888位图中处理不带 Alpha 的 RGB 值