You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Base64创建HICON?及DrawImage调用报错解决

解决Base64转HICON的问题

先修正DrawImage的编译错误

你遇到的编译错误是因为DrawImage需要传入Image*类型的参数,但你传的是Image对象。把调用改成:

gg->DrawImage(&image, 0, 0, wd, hgt);

就能解决参数类型不匹配的问题。

更高效的实现:直接从Image获取HICON

其实不需要先转Bitmap,GDI+的Image类提供了GetHICON方法,可以直接将Image转换为HICON,完整实现步骤如下:

完整代码示例

#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
#include <string>
// 假设你已经包含了base64_decode的实现
#pragma comment (lib,"Gdiplus.lib")

using namespace Gdiplus;

HICON Base64ToHICON(const std::string& base64Str) {
    // 初始化GDI+
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    HICON hIcon = NULL;

    // 解码Base64
    std::string decodedImage = base64_decode(base64Str);
    DWORD imageSize = decodedImage.length();

    // 创建内存流
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, imageSize);
    if (hMem) {
        LPVOID pImage = GlobalLock(hMem);
        memcpy(pImage, decodedImage.c_str(), imageSize);
        GlobalUnlock(hMem);

        IStream* pStream = NULL;
        if (SUCCEEDED(CreateStreamOnHGlobal(hMem, FALSE, &pStream))) {
            // 从流加载Image
            Image image(pStream);
            if (image.GetLastStatus() == Ok) {
                // 直接获取HICON
                image.GetHICON(&hIcon);
            }
            pStream->Release();
        }
        GlobalFree(hMem);
    }

    // 关闭GDI+
    GdiplusShutdown(gdiplusToken);
    return hIcon;
}

// 使用示例
int main() {
    std::string base64Icon = "你的Base64字符串";
    HICON hIcon = Base64ToHICON(base64Icon);

    if (hIcon) {
        WNDCLASSEX wc{};
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.hIcon = hIcon;
        // 其他窗口类初始化代码...

        // 使用完后记得销毁图标
        DestroyIcon(hIcon);
    }
    return 0;
}

关键注意事项

  • 确保Base64解码后的内容是GDI+支持的图像格式(如ICO、PNG、BMP等)
  • 使用完HICON后,必须调用DestroyIcon释放资源,避免内存泄漏
  • GDI+的初始化和关闭要配对,多线程环境下每个线程需单独初始化

内容的提问来源于stack exchange,提问作者Cesar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:25:04