【发布时间】:2016-01-12 06:18:10
【问题描述】:
我有一个 32bpp 位图图像,它有一个 alpha 通道,其值范围为 0-255。我正在尝试使用 win32 API 在窗口中显示它(附加了我用来显示的代码的 sn-p)。
我正在阅读文档,结果发现对于混合,在我想使用每像素值的情况下,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 以这种方式进行混合?我在这里错过了什么?
我用来绘制分层窗口的代码的 sn-p:
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);
【问题讨论】:
标签: c++ winapi alphablending