2009-04-17 67 views
2

GDIPlus混合函数使用alpha乘以预产生的rgb通道来提高效率。然而,通过alpha进行预乘是非常昂贵的,因为您必须逐个处理每个像素。有人有一个优化的函数预乘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。

由于我对装配知之甚少,所以我需要花一些时间才能写出,所以我问是否有人想分享它的实现。 SSE会很好,因为在这篇论文中,通过软件进行alpha混合的收益是300%。

+0

您应该尝试GDI。您可以使用DIB(在内存中)预乘位图alpha。它的速度非常快。 http://stackoverflow.com/questions/307348/how-to-draw-32-bit-alpha-channel-bitmaps – dns 2015-08-12 23:02:19

回答

0

您可能希望有一个看看Eigen C++模板库。它允许您使用高级C++代码,该代码使用优化的汇编程序,并支持SSE/Altivec。

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

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

0

本机Win32 GDI apis处理每个像素并不昂贵。
请参阅MSDN