c++ - 有人有优化的函数来通过 alpha 预乘位图吗?

标签 c++ winapi gdi+ alphablending

GDIPlus 混合函数使用 alpha 位图预乘 rgb channel 以提高效率。然而,预乘 alpha 的成本非常高,因为您必须一个一个地处理每个像素。

看起来它会是 SSE 组装的一个很好的候选者。这里有人想分享它的实现吗?我知道这是一项艰苦的工作,所以这就是我问的原因。我不是想偷你的工作。如果可以的话,你会得到我所有的考虑。

编辑:我不是想通过软件进行 alpha 混合。我正在尝试将图像中每个像素的每个颜色分量与其 alpha 预乘。我这样做是因为 alpha 混合是通过以下公式完成的:dst=srcsrc.alpha+dst(1-dst.alpha) 但是 AlphaBlend Win32 函数确实实现了 dst=src+dst( 1-dst.alpha) 出于优化原因。为了获得正确的结果,您需要在调用 AlphaBlend 之前让 src 等于 src*src.alpha。

因为我对汇编知之甚少,所以我会花一些时间来写,所以我问是否有人愿意分享它的实现。 SSE 会很棒,因为在论文中软件混合 alpha 的增益为 300%。

最佳答案

这里有一篇好文章。它有点旧,但您可能会在使用 MMX 实现 alpha 混合的部分中找到一些有用的东西。这可以很容易地转换为 SSE 指令,以利用更大的寄存器大小(128 位)

MMX Enhanced Alpha Blending

此处为英特尔应用说明,带有源代码

Using MMX™ Instructions to Implement Alpha Blending

关于c++ - 有人有优化的函数来通过 alpha 预乘位图吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/759778/

相关文章:

c++ - 如何在win32的窗口类中设置动态菜单?

c++ - 获取应用程序的 Widgets 树

c# - 在 .NET 中绘制文本

iis - GDI+ 中出现一般性错误 - 权限

windows - 如何在 Windows 中拦截 DNS 查询

c++ - 在 C++ Win32 中创建透明窗口

c++ - 基准测试代码——我做的对吗?

c++ - 在 Visual Studio 和 Qt Creator 中同时开发

c++ - Windows API SysWOW 重定向意外行为

c++ - 对话框窗口重新初始化问题