如何从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
相关产品推荐
相关产品推荐

