【问题标题】:Does someone have an optimized function to premultiply bitmap by alpha?有人有一个优化的功能来通过 alpha 预乘位图吗?
【发布时间】:2010-10-20 01:47:56
【问题描述】:

GDIPlus 混合函数使用通过 alpha 位图预乘 rgb 通道来提高效率。然而,通过 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%。

【问题讨论】:

标签: c++ winapi gdi+ alphablending


【解决方案1】:

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

MMX Enhanced Alpha Blending

此处是英特尔应用笔记,附有源代码

Using MMX™ Instructions to Implement Alpha Blending

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      使用原生 Win32 GDI api 处理每个像素并不昂贵。
      见 MSDN

      【讨论】:

        猜你喜欢
        • 2018-03-30
        • 2011-06-30
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 2011-01-09
        • 2016-04-28
        相关资源
        最近更新 更多