gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:52:25 25 4
gpt4 key购买 nike

我一直在研究创建 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com