我一直在寻找创buildPARGB32位图。 这似乎是必要的,以产生完全与后XP菜单项的图像。
这个例子http://msdn.microsoft.com/en-us/library/bb757020.aspx?s=6是非常有趣,但相当复杂,因为我以前很less使用过OLE接口。 然而,仔细研究了使用WIC和OLE的代码之后,我想我明白它是如何工作的。 混淆了我的一件事就是用户David Hellerman的评论。 总之,他说这个例子的function不完整。 它不考虑源图标中的任何潜在的alpha信息 – 如果有alpha数据,则必须在扫描ppvBuffervariables的同时逐个像素地进行预乘。
我的问题有两个部分。 如何在使用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(你可能已经习惯了把这种格式写成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通道创建位图。 这也是没有必要的,因为在这种情况下,预乘α是不可操作的。