将LPVOID位图指针转换为QPixmap

问题描述 投票:1回答:1

我正在尝试将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工具进行资源管理,但是我没有能力。

c++ qt embedded-resource
1个回答
2
投票

您可以使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.