在WIC'复制像素'调用之后预乘像素

时间:2014-12-01 23:33:12

标签: windows gdi wic

我一直在寻找创建PARGB32位图。这似乎是制作完全适用于XP后菜单项的图像所必需的。

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

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

1 个答案:

答案 0 :(得分:2)

从技术上讲,示例代码是错误的,因为在调用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的情况下(您可能习惯于将该格式写为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是无操作。