QPixmap :: load()崩溃 - 试图避免它

时间:2017-05-03 18:20:05

标签: qt bitmap arm qpixmap

我正在开发一个项目,使用Qt 4.8.3作为ARM平台。在我的项目中,我使用QGraphicsItems ...其中一个是QGraphicsPixmapItem的子类。

使用32位位图图像测试代码 - 它崩溃了。

崩溃不仅发生在ARM上运行,也发生在QVFB中。

QPixmap p;
if (!p.load(filename))  // crashes here
    return false;

我尝试用try ... catch来包围它,但它没有帮助。

我似乎无法介入此版本的Qt代码...但崩溃发生在QImageReader::read(QImage*)内。

堆栈跟踪:

QImageReader::read(QImage*)
QImageReader::read()
QPixmapData::fromFile(QString const&*, QFlags<QT::ImageConversionFlag>)
QPixmap::load(QString const&, char const*, QFlags<QT::ImageConversionFlag>)
QPixmapItem::loadItemFromFile  // mine, the code above

任何其他类型的图像都可以工作......并且相同的32位位图在Windows中正确加载,相同的Qt版本。它无法在桌面的同一Qt版本中加载(返回false)。

我很乐意排除这种类型的文件 - 但我不知道如何。

有没有办法检查图像类型而不加载图像并避免崩溃?

是否有办法可能只加载图像标题,并验证其类型?

1 个答案:

答案 0 :(得分:1)

由于您要排除32位BMP图像,因此您必须阅读BMP header。前两个字节是字符&#34; BM&#34;和字节28,29包含每像素位数。

这是一个小例子,我们将文件读入QByteArray,检查其格式并在好的情况下将其加载到QPixmap。

#include <QtCore>
#include <QtGui>
int main(int argc,char** argv)
{
    QApplication app(argc,argv);
    QFile file("./plot.bmp");
    if (!file.open(QIODevice::ReadOnly)) return 1;
    QByteArray ba=file.readAll();
    if(ba[0]=='B' && ba[1]=='M' && ba[28] == 32) {
        qDebug() << "Wrong format!";
        return 1;
    }
    QPixmap pixmap;
    pixmap.loadFromData(ba);
    qDebug()<<"OK!";
    return 0;
}

或者,如果您不想将所有内容都读入内存,则可以使用QFileifstream等打开文件,检查这些字节然后将其关闭。