我需要创建一个自定义控件来显示带有 alpha 通道的 bmp 图像。背景可以用不同的颜色绘制,图像有阴影,所以我需要真正“绘制”阿尔法通道。
有人知道怎么做吗?
如果可能的话,我还希望使用 alpha 通道信息创建一个蒙版,以了解鼠标是点击了图像还是透明区域。
任何形式的帮助将不胜感激!
谢谢。
已编辑(JDePedro):正如你们中的一些人所建议的那样,我一直在尝试使用 alpha blend 来绘制带有 alpha 通道的位图。这只是我实施的一个测试,我从资源中加载 32 位位图,并尝试使用 AlphaBlend 函数对其进行绘制:
void CAlphaDlg::OnPaint()
{
CClientDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP);
BITMAP BitMap;
bitmap.GetBitmap(&BitMap);
int nWidth = BitMap.bmWidth;
int nHeight = BitMap.bmHeight;
CBitmap *pOldBitmap = dcMem.SelectObject(&bitmap);
BLENDFUNCTION m_bf;
m_bf.BlendOp = AC_SRC_OVER;
m_bf.BlendFlags = 0;
m_bf.SourceConstantAlpha = 255;
m_bf.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dc.GetSafeHdc(), 100, 100, nWidth, nHeight, dcMem.GetSafeHdc(), 0, 0,nWidth, nHeight,m_bf);
dcMem.SelectObject(pOldBitmap);
CDialog::OnPaint();
}
这只是一个测试,所以我将代码放在对话框的 OnPaint 中(我还尝试了 CDC 对象的 AlphaBlend 函数)。
不透明区域被正确绘制,但在位图应该透明的地方我得到白色。
有什么帮助???
这是一个屏幕截图..它不容易看到,但蓝色圆圈周围有一个白色矩形: alt text http://img385.imageshack.us/img385/7965/alphamh8.png
行。我得到了它!我必须为 alpha 值预乘每个像素。有人可以建议优化的方法吗?