2017-05-03 228 views
0

我正在开发一个项目,使用Qt 4.8.3作为ARM平台。在我的项目中,我使用了QGraphicsItems ......其中之一是QGraphicsPixmapItem的一个子类。QPixmap :: load()crash - 试图避免它

该代码已用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版本。它无法加载(返回false)在相同的Qt版本,为桌面。

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

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

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

+0

尝试将图像格式和ImageConversionFlags的各种组合作为参数进行调用。 –

+0

@MichaelO。我试图尝试...但我必须能够读取所有类型的图像文件,不能限制为单一类型。设置除“BMP”之外的任何内容都会返回false - 因为在尝试读取之前图像类型可能会失败 - 但我必须能够读取位图和其他所有类型的文件。我只想排除32位位图。 – Thalia

回答

1

既然你想排除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等文件,检查这些字节,然后将其关闭。