我正在开发一个项目,使用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)。
我很乐意排除这种类型的文件 - 但我不知道如何。
有没有办法检查图像类型而不加载图像并避免崩溃?
是否有办法可能只加载图像标题,并验证其类型?
答案 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;
}
或者,如果您不想将所有内容都读入内存,则可以使用QFile
,ifstream
等打开文件,检查这些字节然后将其关闭。