我正在尝试将BMP图像从资源文件夹加载到QPixmap对象中。但是,即使将这些字节重写为新文件也可以复制原始字节,但我无法读取这些字节。这是我的加载方法:
QPixmap* GUIMain::loadImage(int name) {
// Resource loading, works fine
HRSRC rc = FindResource(NULL, MAKEINTRESOURCE(name), RT_BITMAP);
if (rc == NULL) {
printf("INVALID RESOURCE ADDRESS (%i)\n", name);
return new QPixmap();
}
HGLOBAL rcData = LoadResource(NULL, rc);
LPVOID data = LockResource(rcData);
DWORD data_size = SizeofResource(NULL, rc);
// Rewrite file to new file, works fine
ofstream output("E:\\" + to_string(name) + ".bmp", std::ios::binary);
BITMAPFILEHEADER bfh = { 'MB', 54 + data_size, 0, 0, 54 };
output.write((char*)&bfh, sizeof(bfh));
output.write((char*)data, data_size);
output.close();
// Need to return, can't get bytes working
return new QPixmap(/*?*/);
}
使用resource.h
文件中的定义调用此方法。
我试图使用与stringstream
相同的调用来使用ofstream
,然后将该流用作QPixmap
的源,但是该流没有产生相同的输出。
以下是我的resource.h
文件的相关部分:
#define IDB_BITMAP1 101
#define IDB_BITMAP2 102
这是我的Resource.rc
文件:
IDB_BITMAP1 BITMAP "E:\\Downloads\\onIcon.bmp"
IDB_BITMAP2 BITMAP "E:\\Downloads\\offIcon.bmp"
我知道我应该使用Qt工具进行资源管理,但是我没有能力。
您可以使用QPixmap :: loadFromData(...)从原始字节创建QPixmap,但也不必在.rc文件中将资源声明为BITMAP。
位图资源旨在与LoadBitmap(...)一起使用,并在位图标头被剥离的情况下存储在.exe中。 (Raymond Chen discusses this here)由于您未使用LoadBitmap,因此请勿将资源的类型设置为位图,而是将其声明为任意二进制数据,例如
IDB_BITMAP1 RCDATA "E:\\Downloads\\onIcon.bmp"
然后执行如下的图像加载例程:
QPixmap* GUIMain::loadImage(int name) {
// ...
HGLOBAL rcData = LoadResource(NULL, rc);
LPVOID data = LockResource(rcData);
DWORD data_size = SizeofResource(NULL, rc);
QPixmap* pm = new QPixmap();
pm->loadFromData( static_cast<uchar*>(data), data_size, "bmp");
return pm;
}