我正在尝试将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(...)从bmp格式的字节创建QPixmap,但也不必在.rc文件中将资源声明为“BITMAP”。
位图资源旨在与LoadBitmap(...)或LoadImage(...)一起使用,并存储在.exe中,并且去除了位图 header 。 (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;
}
关于c++ - 将LPVOID位图指针转换为QPixmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547667/