Мне нужно создать настраиваемый элемент управления для отображения изображений BMP с альфа-каналом. Фон может быть окрашен в разные цвета, а изображения имеют тени, поэтому мне нужно по-настоящему «раскрасить» альфа-канал.
Кто-нибудь знает, как это сделать?
Я также хочу, если возможно, создать маску, используя информацию об альфа-канале, чтобы знать, была ли мышь нажата на изображении или на прозрачной области.
Мы будем благодарны за любую помощь!
Спасибо.
Отредактировано (JDePedro): как некоторые из вас предположили, я пытался использовать альфа-смешение, чтобы раскрасить растровое изображение с альфа-каналом. Это всего лишь тест, который я реализовал, когда я загружаю 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 диалогового окна (я также пробовал функцию AlphaBlend объекта CDC).
Непрозрачные области окрашиваются правильно, но я получаю белый цвет там, где растровое изображение должно быть прозрачным.
Любая помощь???
Это снимок экрана ... его непросто увидеть, но вокруг синего круга есть белый прямоугольник: http://img385.imageshack.us/img385/7965/alphamh8.png
В порядке. Я понял! Мне нужно предварительно умножить каждый пиксель на значение альфа. Кто-нибудь может предложить оптимизированный способ сделать это?