首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解Windows环境下的AlphaBlending

了解Windows环境下的AlphaBlending
EN

Stack Overflow用户
提问于 2016-01-12 06:18:10
回答 1查看 389关注 0票数 0

我有一个32 255位图图像,它有一个α通道,其值从0到255不等。我试图使用win32 API在窗口中显示这一点(我用来显示的代码片段附在后面)。

我正在阅读文档,结果发现,在我想要使用每像素值的情况下,windows使用以下公式进行混合:

代码语言:javascript
复制
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

这太奇怪了。我原以为它会使用:

代码语言:javascript
复制
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要以这种方式进行混合?我在这里错过了什么?

用于绘制分层窗口的代码片段:

代码语言:javascript
复制
            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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-12 06:29:16

来自文档

请注意,API使用预乘alpha,这意味着位图中的红色、绿色和蓝色通道值必须与alpha通道值进行预乘。例如,如果alpha通道值为x,则红色、绿色和蓝色通道必须乘以x,并在调用之前除以0xff。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34736785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档