2017-05-03 232 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等文件,檢查這些字節,然後將其關閉。