了解Windows中的字母混合

Understanding AlphaBlending in Windows

本文关键字:混合 Windows 了解      更新时间:2023-10-16

我有一个32bpp的位图图像,它有一个值在0-255之间的alpha通道。我正试图使用win32API在一个窗口中显示这一点(我用来显示的代码片段已附加)。

我在阅读文档时发现,对于混合,在我想使用每像素值的情况下,windows使用以下公式:

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);

来自文档:

注意API使用预乘阿尔法,位图中的绿色和蓝色通道值必须与alpha通道值。例如如果阿尔法通道值是x,红色、绿色和蓝色通道必须乘以x并除以在调用之前通过0xff。

所以,你是对的,但你以前必须手工做。