AlphaBlend генерирует неправильные цвета

Мне удалось избежать Windows GDI на протяжении десятилетий, и теперь я плачу. Следующий код C ++ не приводит к правильным цветам. Предполагается, что он просто заполняет окно белым цветом, а затем альфа-смешивает одно растровое изображение. Вся альфа является альфа-пиксельной в растровом изображении.

// Create a memory DC
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmMem = CreateCompatibleBitmap(hdc, cxWnd, cyWnd);
SelectObject(hdcMem, hbmMem);

// White-fill the BG
FillRect(hdcMem, &rectWnd, static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)));

// Alpha blend the bitmap into the memory DC
HDC hdcSrc = CreateCompatibleDC(hdcMem);
HBITMAP hbmOld = static_cast<HBITMAP>(SelectObject(hdcSrc, hbm));
BLENDFUNCTION bfn = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
AlphaBlend(hdcMem, x, y, cxBmp, cyBmp, hdcSrc, 0, 0, cxBmp, cyBmp, bfn);
SelectObject(hdcSrc, hbmOld);
DeleteDC(hdcSrc);

// Blit the memory DC to the screen
BitBlt(hdc, 0, 0, cxWnd, cyWnd, hdcMem, 0, 0, SRCCOPY);

Я проверил, что все значения переменных верны и что растровое изображение в hbm имеет правильные цвета пикселей и альфа.

Результат показывает много неправильных цветов, например, синий пиксель с низким альфа-каналом должен быть бледно-голубым, но вместо этого темно-красным. Пиксели с высоким уровнем альфа намного ближе к тому, что они должны быть.

Любая помощь приветствуется. ТИА.

0

Решение

Ответ из подсказок в комментариях: каждый цветовой канал в каждом пикселе должен быть предварительно умножен альфа перед смешиванием.

get DIB bits
for each pixel
r = r * alpha / 255
g = g * alpha / 255
b = b * alpha / 255
set DIB bits

MS не делает этот материал легко найти. Там нет ни единого намека на это в единственном образце альфа-смешивания, который я смог найти:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd183353(v=vs.85).aspx

3

Другие решения