У меня есть растровое изображение 32bpp, которое имеет альфа-канал со значениями в диапазоне от 0 до 255. Я пытаюсь отобразить это в окне, используя API-интерфейсы win32 (прилагается фрагмент кода, который я использую для отображения).
Я читал документацию, и оказалось, что для смешивания, в случае, когда я хочу использовать попиксельные значения, окна используют следующую формулу:
Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue
Это странно. Я ожидал, что он будет использовать:
Dst.Red = Src.Alpha*Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Alpha*Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Alpha*Src.Blue + (1 - Src.Alpha) * Dst.Blue
потому что именно это создает эффект наложения (полупрозрачности).
Правильно ли мое ожидание? Если да, то почему Windows выполняет смешивание таким образом? Что мне здесь не хватает?
фрагмент кода, который я использую для рисования многослойного окна:
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 255;
bf.AlphaFormat = AC_SRC_ALPHA;
POINT ptOrigin = { 0, 0 };
SIZE windowSize = { 300, 300 };
POINT ptZero = { 0, 0 };
UpdateLayeredWindow(m_sThis->m_hWnd, dc, &ptOrigin, &windowSize,
hdc, &ptZero, RGB(255, 255, 255), &bf, ULW_ALPHA);