c++ 创建一个窗口将base64图像展示在窗口上不使用qt 详细方法 不写入文件 使用gdi+ 详细代码
时间: 2023-12-29 17:06:07 浏览: 205
windows窗口设计程序 C/C++程序设计
4星 · 用户满意度95%
以下是一个简单的使用 GDI+ 显示 Base64 编码图片的 C++ 代码示例:
```c++
#include <windows.h>
#include <gdiplus.h>
#include <string>
#include <iostream>
#pragma comment(lib, "gdiplus.lib")
using namespace Gdiplus;
using namespace std;
int main()
{
// 初始化 GDI+
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// 创建窗口
HWND hWnd = CreateWindow(L"STATIC", L"Base64 Image Viewer", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, NULL, NULL);
// 解码 Base64 图片
string base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAodJREFUeNqUk8FqwkAQhO1FqgcRBHtEgQX0gQfQgZgJn+CX8AYgKp8Bf4C224hDZt6GgWIBFV1jNwXQx0XW7Amp2c8J3M9fc33v+vLzWv1fM9zIzPj4+M2+aG7zGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbH6KtFZPfV7WvQAAAABJRU5ErkJggg==";
string base64Image = base64String.substr(base64String.find(',') + 1);
vector<BYTE> imageData;
BYTE* decodedData = NULL;
DWORD decodedSize = 0;
if (CryptStringToBinaryA(base64Image.c_str(), base64Image.length(), CRYPT_STRING_BASE64, NULL, &decodedSize, NULL, NULL))
{
decodedData = new BYTE[decodedSize];
if (CryptStringToBinaryA(base64Image.c_str(), base64Image.length(), CRYPT_STRING_BASE64, decodedData, &decodedSize, NULL, NULL))
{
imageData.assign(decodedData, decodedData + decodedSize);
}
delete[] decodedData;
}
// 创建 GDI+ 图片对象
Bitmap* pBitmap = NULL;
if (imageData.size() > 0)
{
HGLOBAL hGlobalMemory = GlobalAlloc(GMEM_MOVEABLE, imageData.size());
if (hGlobalMemory)
{
LPVOID pImageBuffer = GlobalLock(hGlobalMemory);
if (pImageBuffer)
{
CopyMemory(pImageBuffer, imageData.data(), imageData.size());
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(hGlobalMemory, FALSE, &pStream) == S_OK)
{
pBitmap = Bitmap::FromStream(pStream);
pStream->Release();
}
GlobalUnlock(hGlobalMemory);
}
GlobalFree(hGlobalMemory);
}
}
// 显示图片到窗口
HDC hdc = GetDC(hWnd);
Graphics graphics(hdc);
graphics.DrawImage(pBitmap, 0, 0, 640, 480);
ReleaseDC(hWnd, hdc);
// 进入消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 清理 GDI+
GdiplusShutdown(gdiplusToken);
return 0;
}
```
这段代码的思路是:
1. 初始化 GDI+;
2. 创建窗口;
3. 解码 Base64 图片;
4. 创建 GDI+ 图片对象;
5. 显示图片到窗口;
6. 进入消息循环;
7. 清理 GDI+。
需要注意的是,这段代码中的 Base64 图片是硬编码在程序中的,实际应用中可以通过网络请求或者本地文件读取等方式获取 Base64 图片数据,然后再进行解码和显示。
阅读全文