【问题标题】:Pre-multiply pixels after WIC 'Copy Pixels' callWIC“复制像素”调用后预乘像素
【发布时间】:2014-12-02 09:26:16
【问题描述】:

我一直在研究创建 PARGB32 位图。这似乎是生成完全适用于 XP 后菜单项的图像所必需的。

这个例子 http://msdn.microsoft.com/en-us/library/bb757020.aspx?s=6 非常有趣但相当复杂,因为我以前很少使用 OLE 接口。但是,在仔细研究了使用 WIC 和 OLE 的代码之后,我想我理解它是如何工作的。让我感到困惑的一件事是用户“David Hellerman”的评论。总而言之,他指出此示例功能不完整。它没有考虑源图标中任何潜在的 alpha 信息 - 如果存在 alpha 数据,则必须在扫描 ppvBuffer 变量时逐个像素地对其进行预乘。

我的问题有两个部分。如何在使用 WIC 而不是 GDI 时检测图标中是否存在 alpha 数据,如果确实存在,我如何将其预乘到像素中?

【问题讨论】:

    标签: windows gdi wic


    【解决方案1】:

    从技术上讲,示例代码是错误的,因为它在调用 CopyPixels 时没有考虑或检查 IWICBitmap 对象的格式。 CreateBitmapFromHICON 在创建位图时可能总是使用特定的格式(该示例表明它是 32 位 PBGRA,但 cmets 建议它是 BGRA),但是 MSDN 没有记录这一点,并且依赖它至少是不好的形式。 WIC 支持多种像素格式,但并非所有像素格式都是 32 位或 RGB。

    您可以使用 WICConvertBitmapSource 函数 (http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819(v=vs.85).aspx) 将数据转换为特定的已知格式,在您的情况下,您需要 GUID_WICPixelFormat32bppPBGRA(您可能习惯于将该格式写为 PARGB,但 WIC 使用基于字节数组中的组件顺序而不是 32 位整数的奇怪命名约定)。如果转换意味着对数据进行预乘,它会这样做,但关键是,如果你想要一种特定的格式,你不需要担心它是如何到达那里的。您可以像 MSDN 示例使用其 IWICBitmap 一样使用生成的 IWICBitmapSource。

    您可以使用 IWICBitmapSource::GetPixelFormat (http://msdn.microsoft.com/en-us/library/windows/desktop/ee690181(v=vs.85).aspx) 来确定图像的像素格式。但是,一般无法知道 alpha 数据(如果格式有 alpha 数据)是否被预乘,您只需要识别格式 GUID。当我想专门处理一种以上的格式时,我通常使用 GetPixelFormat,但对于我不处理的格式,我仍然依赖 WICConvertBitmapSource。

    编辑:我错过了你的部分问题。无法根据 IWICBitmap 检测图标最初是否具有 Alpha 通道,因为 WIC 在所有情况下都会从图标创建带有 Alpha 通道的位图。这也不是必需的,因为在这种情况下预乘 alpha 是无操作的。

    【讨论】:

    • 一个优秀的答案@Vincent,它真的给了我一些使用这个 COM 东西的新想法。这对我来说都是全新的!此外,我认为 MSN 页面上说 WIC 代码错误的小伙子 - 实际上是他自己错了!如果他进一步阅读该页面,他会看到工作示例中使用的Initialize 成员函数,它与我认为您通过IWICConvertBitmapSource 函数建议的事情相同。我说的对吗?
    • 嗯,看起来他们写了两次代码,第二次做对了(在 AddIconToMenuItem 中),但是靠近顶部的代码(这是我在回答问题时看到的全部)是错误的。是的,他们完全按照我的建议做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2019-08-26
    • 2013-11-28
    相关资源
    最近更新 更多