Qt QPixmap::load()崩溃-试图避免它
我正在做一个项目,使用Qt4.8.3作为ARM平台。在我的项目中,我使用QGraphicsSitems。。。其中一个是QGraphicsPixmapItem的子类 该代码使用32位位图图像进行了测试,结果崩溃了 碰撞不仅发生在手臂上,也发生在QVFB上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代码。。。但崩溃发
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位位图。