了解Windows中的字母混合
Understanding AlphaBlending in Windows
我有一个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。
所以,你是对的,但你以前必须手工做。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- 在Windows中以.exe的形式运行c++
- 混合调试和发布库:Windows vs Linux,静态与共享
- Windows Phone 8:监控混合C#/C++中的内存使用情况
- 在Linux和Windows下混合CIN和Getline
- 抓取出现在windows音频混合器(C#或C++)中的音频会话
- 了解Windows中的字母混合
- 在Windows上混合使用Qt和Objective-C
- 混合c++异常处理和SEH (windows)