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

QPixmap::load() crash - trying to avoid it

我正在开发一个项目,在 ARM 平台上使用 Qt 4.8.3。在我的项目中,我使用 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)。

我很乐意排除此类文件 - 但我不知道如何排除。

有什么方法可以在不加载图像的情况下检查图像类型并避免崩溃?

有没有办法只加载图像 header,并验证其类型?

既然要排除32位BMP图片,就得看个BMP header。前两个字节是字符 "BM",字节 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 等打开文件,检查这些字节然后关闭它。