C++ 是否有人有优化的函数通过alpha对位图进行预乘?

C++ 是否有人有优化的函数通过alpha对位图进行预乘?,c++,winapi,gdi+,alphablending,C++,Winapi,Gdi+,Alphablending,GDIPlus混合函数通过alpha位图使用预乘rgb通道以提高效率。然而,通过alpha进行预乘是一项非常昂贵的任务,因为您必须逐个处理每个像素 看来,它将是苏格兰和南方能源公司大会的一个很好的候选人。这里是否有人想分享它的实现?我知道这是一项艰苦的工作,所以这就是我问的原因。我不是想偷你的作品。如果可以的话,你会得到我对你的全部考虑 编辑:我不想用软件做alpha混合。我试着将图像中每个像素的每个颜色分量按其alpha进行预乘。我这样做是因为alpha混合是通过以下公式完成的:dst=src

GDIPlus混合函数通过alpha位图使用预乘rgb通道以提高效率。然而,通过alpha进行预乘是一项非常昂贵的任务,因为您必须逐个处理每个像素

看来,它将是苏格兰和南方能源公司大会的一个很好的候选人。这里是否有人想分享它的实现?我知道这是一项艰苦的工作,所以这就是我问的原因。我不是想偷你的作品。如果可以的话,你会得到我对你的全部考虑

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


写这篇文章需要一些时间,因为我对汇编知之甚少,所以我问是否有人愿意分享它的实现。SSE会很好,因为在论文中,软件的收益将达到300%。

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

此处为英特尔应用程序说明,附带源代码


你可能想看看C++模板库。它允许您使用高级C++代码,使用优化的汇编程序,支持SSE /AlTiVEC。 快。(参见基准)。
表达式模板允许智能地删除临时变量,并在适当的时候启用延迟计算——在大多数情况下,Eigen会自动处理这一问题,并处理别名。 对SSE(2及更高版本)和AltiVec指令集执行显式矢量化,并以优雅的方式回退到非矢量化代码。表达式模板允许对整个表达式全局执行这些优化。 对于固定大小的对象,可以避免动态内存分配,并且在有意义时展开循环。 对于大型矩阵,特别注意缓存友好性

优雅。(参见API showcase)。
由于使用了表达式模板,API非常干净且富有表现力。在Eigen之上实现一个算法就像复制伪代码。您可以使用复杂的表达式,但仍然依赖于Eigen来生成优化的代码:您不需要手动将表达式分解为小步


使用本机Win32 GDI API处理每个像素并不昂贵。

请参见MSDN,您应该尝试GDI。可以使用DIB(内存中)预乘位图alpha。它燃烧得很快。