有人有优化的函数可以将位图与alpha预乘吗?

3
GDIPlus混合函数使用预乘以alpha通道的RGB位图以提高效率。然而,由于必须逐个像素地处理,预乘以alpha是非常昂贵的。
看起来它是SSE汇编的好选择。这里有没有人想分享他的实现?我知道这很辛苦,所以才会问。我不是想窃取你的工作。如果你能分享这个,你将得到我的所有考虑。
编辑:我不是试图通过软件进行alpha混合。我正在尝试将图像中每个像素的每个颜色分量都乘以其alpha值。我这样做是因为alpha混合是通过公式完成的:dst=src*src.alpha+dst*(1-dst.alpha),然而AlphaBlend Win32函数实现了dst=src+dst*(1-dst.alpha)以优化性能。为了获得正确的结果,在调用AlphaBlend之前,需要使src等于src*src.alpha。
对我来说写这个需要一些时间,因为我很少了解汇编语言,所以我在问是否有人想分享他的实现。在论文中,通过软件进行alpha混合的收益是300%,所以SSE会很棒。

你应该尝试使用GDI。你可以使用DIB(在内存中)预乘位图alpha通道。它非常快速。https://dev59.com/c3VC5IYBdhLWcg3wZwNT - dns
3个回答

2

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

MMX增强Alpha混合

Intel应用笔记在这里,还有源代码

使用MMX™指令实现Alpha混合


0

您可能想要查看Eigen C++模板库。它允许您使用高级C++代码,该代码使用支持SSE/Altivec的优化汇编语言。

快速。(请参见基准测试)。
表达式模板可以智能地删除临时变量并在适当时启用惰性评估 - Eigen会自动处理这些,并在大多数情况下也处理别名。对于SSE(2及更高版本)和AltiVec指令集,执行显式矢量化,并优雅地回退到非矢量化代码。表达式模板允许全局执行这些优化整个表达式。对于固定大小的对象,避免了动态内存分配,并在有意义时展开循环。对于大型矩阵,特别注意缓存友好性。

优雅。(请参见API展示)。
由于表达式模板,API非常干净和富有表现力。在Eigen上实现算法感觉就像只是复制伪代码。您可以使用复杂的表达式,仍然依赖于Eigen生成优化的代码:您无需手动将表达式分解为小步骤。


0

使用本地Win32 GDI API处理每个像素并不昂贵。
请参阅MSDN。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接