使用 GDIPlus (WIN32 C++) 显示存储为 alpha 资源的图标

Posted

技术标签:

【中文标题】使用 GDIPlus (WIN32 C++) 显示存储为 alpha 资源的图标【英文标题】:Displaying Icons stored as resources with alpha using GDIPlus (WIn32 C++) 【发布时间】:2012-09-12 18:34:18 【问题描述】:

我想要使用 GDIPlus 显示一个带有部分 alpha(alpha 值介于 0 和 255 之间)的图标。当使用采用直接文件名的 GDI+ 的位图构造函数时,文件正确显示。但是,当从资源加载时,它在识别 alpha 时出现问题。我在 MSDN 上看了,alpha 有问题:http://msdn.microsoft.com/en-us/library/windows/desktop/ms536318.aspx。通过从图标中检索 ICONINFO 结构,我可以摆脱完全透明的像素,但是,部分透明的像素仍然显示为完全不透明或完全透明。

我想知道如何从具有部分 alpha 值的资源中的图标创建 Win32 位图。

【问题讨论】:

显示一些代码。从资源中加载部分透明的图标完全没有问题。 /*加载并锁定资源*/ HICON icon = LoadIcon (modhandle, MAKEINTRESOURCE(_wtoi(vImageName)));位图 = Gdiplus::Bitmap::FromHICON(icon);如此加载的位图具有零或完整的 alpha,并且看不到部分 alpha 我总是使用 LoadImage,因为它可以让您控制图标大小。但他们都没有部分阿尔法的问题。应用程序通常通过调用 LoadIcon 显示带有 alpha 的标准 IDI_xxx 图标。调用 LoadIcon 后出现问题。 我使用的图标不是标准的 IDI_xxx 图标(可能是 IDI_xxx 图标没有部分 alpha 的情况,但我不确定),而是资源中包含的自定义图标. MSDN 上也报告了一个社区添加错误(请参阅“社区添加”msdn.microsoft.com/en-us/library/windows/desktop/…),不确定我是否因为这个或其他原因而面临问题 我使用 LoadIcon 和 LoadImage 加载我自己的自定义图标。完全没有问题。 IDI_xxx 也有部分 alpha。你的问题在别处。 【参考方案1】:

您可以使用LoadResource 获取指向图标及其图像数据的指针。您可以将指向图像数据的指针传递给适当的Bitmap constructor。这有点麻烦,因为图标有一个peculiar resource format。

如果可能,将图像存储为透明(即 32bpp argb)位图会更简单。在这种情况下,您可以将LoadImage 与 LR_CREATEDIBSECTION 一起使用。

更新

显然 LoadIcon 确实正确加载了 alpha。当您从 HICON 构造 GdiPlus::Bitmap 时,问题似乎是 GdiPlus 不尊重 alpha。你可以做的是:

使用 LoadIcon 加载图标。 使用 GetIconInfo 获取 ICONINFO。 hbmColor 是透明位图的句柄。 使用 GetDIBits 从 hbmColor 中获取位图位。 将数据传递给Bitmap constructor,它接受位并理解 alpha。

【讨论】:

将图标存储为资源并加载到HICON没有问题。它适用于部分 alpha。【参考方案2】:

在您调用 LoadIcon 之后 Alpha 通道受到干扰。加载图标的 Win32 API,例如LoadIcon、LoadImage 等都得到了很好的证明。它们可靠地加载带有部分 alpha 的图标。

您需要调查加载图标后执行的代码。我无法为您提供解决方案或解释,但我确信 LoadIcon 不是罪魁祸首。

我想知道如何从 资源中带有部分 alpha 值的图标。

调用 GetIcon 或 GetImage 以获取 HICON。然后调用 GetIconInfo。您需要的位图在 ICONINFO 结构的 hbmColor 字段中。

【讨论】:

以上是关于使用 GDIPlus (WIN32 C++) 显示存储为 alpha 资源的图标的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GDIPLUS 绘制第二个显示器

Gdiplus::屏幕上的图像 (C++)

保存的 Gdiplus::Bitmap 始终具有 Alpha 通道 (RGBA/ARGB)

在 C++ 中使用 Gdiplus 创建透明位图

Win32:是不是有使用硬件加速的替代 GDI32.dll?

图片转换,PNG转32位BMP;BMP大小转换