windows - WIC 'Copy Pixels' 调用后预乘像素

标签 windows gdi wic

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

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

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

最佳答案

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

您可以使用 WICConvertBitmapSource 函数 ( http://msdn.microsoft.com/en-us/library/windows/desktop/ee719819(v=vs.85).aspx ) 将数据转换为特定的已知格式,在您的情况下,您需要 GUID_WICPixelFormat32bppPBGRA(您可能习惯于看到该格式写为 PARRGB,但 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 channel ,因为 WIC 在所有情况下都会从图标创建带有 alpha channel 的位图。这也不是必需的,因为在这种情况下预乘 alpha 是空操作。

关于windows - WIC 'Copy Pixels' 调用后预乘像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27239343/

相关文章:

c++ - PNG Gamma 校正

math - 将过于精确的分数舍入到人类友好的精度

windows - 如何为 Windows 构建或获取原始最新版本的 GCC?

windows - lockResource() 返回一个指针,但指向未知的结构

visual-c++ - 初学者 在 MFC C++ 中,为什么设备上下文需要创建一个旧的字体/位图/等指针,然后在最后选择对象()?

c++ - 如何不丢弃 CDC 路径?

c++ - 如何获取 Win32 线程的名称?

c - 静默安装 winpcap

graphics - 如何实现高速动画?

delphi - TWICImage : How to overlay transparent PNG on JPG?