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

Qt QPixmap::load()崩溃-试图避免它,qt,bitmap,arm,qpixmap,Qt,Bitmap,Arm,Qpixmap,我正在做一个项目,使用Qt4.8.3作为ARM平台。在我的项目中,我使用QGraphicsSitems。。。其中一个是QGraphicsPixmapItem的子类 该代码使用32位位图图像进行了测试,结果崩溃了 碰撞不仅发生在手臂上,也发生在QVFB上 QPixmap p; if (!p.load(filename)) // crashes here return false; 我试着用一个“尝试…捕捉”来围绕这一点,但没有起到任何作用 我似乎无法为这个版本插入Qt代码。。。但崩溃发

我正在做一个项目,使用Qt4.8.3作为ARM平台。在我的项目中,我使用QGraphicsSitems。。。其中一个是QGraphicsPixmapItem的子类

该代码使用32位位图图像进行了测试,结果崩溃了

碰撞不仅发生在手臂上,也发生在QVFB上

QPixmap p;
if (!p.load(filename))  // crashes here
    return false;
我试着用一个“尝试…捕捉”来围绕这一点,但没有起到任何作用

我似乎无法为这个版本插入Qt代码。。。但崩溃发生在QImageReader::readQImage*内部

堆栈跟踪:

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

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

有没有办法在不加载映像和避免崩溃的情况下检查映像类型


是否有办法仅加载图像标题并验证其类型?

由于要排除32位BMP图像,必须读取一个。前两个字节是字符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;
}

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

尝试使用图像格式和ImageConversionFlags的各种组合作为参数来调用它。@MichaelO。我试着去试验。。。但我必须能够读取那里所有类型的图像文件,不能限制为单一类型。设置除BMP以外的任何内容都返回false-因为在尝试读取之前图像类型可能会失败-但我必须能够读取位图和其他类型的文件。我只想排除32位位图。