c++ - 将LPVOID位图指针转换为QPixmap

标签 c++ qt embedded-resource

我正在尝试将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/

相关文章:

c# - 无法使用 C# 在 SQLite 中插入数据

java - 如何读取另一个jar文件中的文件?

java - 从jar中读取资源文件

c++ - 使用 C++ 读取文件夹中的所有文件,包括子文件夹中的文件

c++ - 运行 QFileDialog::getOpenFileName 而不需要单独的事件循环?

c++ - 在 Qt 开发人员中将 double 转换为 int

c++ - 超时时暂停线程

c++ - 是否需要实现来诊断对同一TU中相同显式专业的重复定义进行ODR违规?

C++ 模板别名(在特定地方使用)

c++ - 从公斤换算成英石和磅时