【问题标题】:Displaying Icons stored as resources with alpha using GDIPlus (WIn32 C++)使用 GDIPlus (WIN32 C++) 显示存储为 alpha 资源的图标
【发布时间】: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。你的问题在别处。

标签: winapi icons gdi+ embedded-resource


【解决方案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 字段中。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多