在 Qt Release 版本里正确使用图像编码库


这两天在写 Qt 代码时,用 QPixmap 的 load 或是 loadFromData 方法来从图片文件里导入 Jpeg 图像数据,结果在 debug 版本下可以正确导入图像,可是在 release 版本下却没有办法导入图像。

这个时候,原因多半是 Qt 不支持这个图像格式,可以用下面的代码来检查当前的 Qt 版本支持的图像格式种类,并检查里面是否支持 JPEG 图像格式。

QString fileFormats = "";
/* Get all inputformats */
for (int i = 0; i < QImageReader::supportedImageFormats().count(); i++) {
        fileFormats += "*."; /* Insert wildcard */
        fileFormats
                        += QString(QImageReader::supportedImageFormats().at(i)).toLower(); /* Insert the format */
        fileFormats += " "; /* Insert a space */
}

从结果可以看出,当前的 Release 版本的确是不支持 Jpeg 图像格式。是由什么原因造成的这个现象呢?

这里情况比较特殊:并不是 Qt 不支持这个图像格式,而是需要在 release 版本里包括这个解码库。即把 qjpeg4.dll 链接库拷贝成 release 目录下的

imageformats/qjpeg4.dll

文件。你只需要让 Release 版本的可执行文件,可以正确找到该编码库链接库即可。请注意当你打包成安装文件进行安装时,一定要注意把该链接库安装到目录 imageformats 下,否则依然无法正确使用。

类似的问题,同样会存在于字符集编码等其它插件里:当你使用了指定的字符集编码时,则同样需要打包类似的库。例如,对于简体中文来说,需要把 qcncodecs4.dll 打包安装成

/codecs/qcncodecs4.dll

文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++创建一个窗口并将base64图像展示在窗口上,需要进行以下步骤: 1. 首先,需要使用GDI+来处理图像,所以需要在代码包含以下头文件: ``` #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib") ``` 2. 接着,需要创建一个窗口,可以使用Windows API的CreateWindow函数。示例代码如下: ``` HWND hwnd = CreateWindow("STATIC", NULL, WS_VISIBLE | WS_POPUP, 0, 0, 500, 500, NULL, NULL, NULL, NULL); ``` 3. 然后,需要将base64图像解码为位图。可以使用GDI+的Bitmap类来完成。示例代码如下: ``` Gdiplus::Bitmap* bitmap; std::string base64_image; // 假设已经有一个base64编码的图像字符串 std::vector<BYTE> data; data.insert(data.end(), base64_image.begin(), base64_image.end()); data.push_back('\0'); DWORD size = 0; BYTE* buffer = NULL; if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) { buffer = new BYTE[size]; if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) { IStream* stream = SHCreateMemStream(buffer, size); bitmap = Gdiplus::Bitmap::FromStream(stream); stream->Release(); } delete[] buffer; } ``` 4. 最后,需要将位图绘制到窗口上。可以使用GDI+的Graphics类和HDC句柄来完成。示例代码如下: ``` PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(bitmap, 0, 0, 500, 500); EndPaint(hwnd, &ps); ``` 完整代码示例: ``` #include <windows.h> #include <gdiplus.h> #include <vector> #include <string> #include <wincrypt.h> #include <shlwapi.h> #pragma comment (lib,"Gdiplus.lib") #pragma comment (lib,"Crypt32.lib") #pragma comment (lib,"Shlwapi.lib") LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { Gdiplus::Bitmap* bitmap; std::string base64_image; // 假设已经有一个base64编码的图像字符串 std::vector<BYTE> data; data.insert(data.end(), base64_image.begin(), base64_image.end()); data.push_back('\0'); DWORD size = 0; BYTE* buffer = NULL; if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) { buffer = new BYTE[size]; if (::CryptStringToBinaryA(data.data(), data.size(), CRYPT_STRING_BASE64, buffer, &size, NULL, NULL)) { IStream* stream = SHCreateMemStream(buffer, size); bitmap = Gdiplus::Bitmap::FromStream(stream); stream->Release(); } delete[] buffer; } PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(bitmap, 0, 0, 500, 500); EndPaint(hwnd, &ps); break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hwnd; MSG Msg; // 初始化 GDI+ Gdiplus::GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 注册窗口类 wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWindowClass"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&wc)) { MessageBox(NULL, "窗口注册失败!", "错误", MB_ICONERROR | MB_OK); return 0; } // 创建窗口 hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "MyWindowClass", "窗口标题", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); if (hwnd == NULL) { MessageBox(NULL, "窗口创建失败!", "错误", MB_ICONERROR | MB_OK); return 0; } // 消息循环 while (GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } // 关闭 GDI+ Gdiplus::GdiplusShutdown(gdiplusToken); return Msg.wParam; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值