2017-05-03 1 views
0

Ich arbeite an einem Projekt, mit Qt 4.8.3 für eine ARM-Plattform. In meinem Projekt verwende ich QGraphicsItems ... von denen eine eine Unterklasse von QGraphicsPixmapItem ist.QPixmap :: load() Absturz - versuchen, es zu vermeiden

Der Code wurde mit einem 32 Bit Bitmap-Bild getestet - und es stürzt ab.

Der Absturz tritt nicht nur beim Ausführen auf dem ARM, sondern auch in QVFB.

Ich habe versucht, dies mit einem Versuch zu umgehen ... fangen, aber es hat nicht geholfen.

Ich scheine nicht in der Qt-Code für diese Version Schritt ... aber der Absturz tritt innerhalb QImageReader::read(QImage*).

Der Stack-Trace:

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 

Jede andere Art von Bild arbeitet ... und die gleichen 32-Bit-Bitmap lädt richtig in den Fenstern, gleiche Qt-Version. Es wird nicht geladen (false zurückgegeben) in derselben Qt-Version für Desktop.

Ich würde gerne diese Art von Datei ausschließen - aber ich weiß nicht wie.

Gibt es eine Möglichkeit, nach dem Bildtyp zu suchen, ohne das Bild zu laden und den Absturz zu vermeiden?

Gibt es eine Möglichkeit, vielleicht nur den Image-Header zu laden und seinen Typ zu überprüfen?

+0

Versuchen Sie es mit Bildformat und verschiedenen Kombinationen von ImageConversionFlags als Parameter aufzurufen. –

+0

@MichaelO. Ich habe versucht zu experimentieren ... aber ich muss in der Lage sein, alle Arten von Bilddateien dort zu lesen, kann nicht auf einen einzigen Typ beschränken. Wenn Sie etwas anderes als "BMP" einstellen, wird false zurückgegeben - weil der Bildtyp wahrscheinlich fehlschlägt, bevor das Lesen versucht wird - aber ich muss in der Lage sein, Bitmaps und alle anderen Dateitypen zu lesen. Ich möchte nur 32-Bit-Bitmaps ausschließen. – Thalia

Antwort

1

Da Sie 32-Bit-BMP-Bilder ausschließen möchten, müssen Sie eine BMP header lesen. Die ersten zwei Bytes sind die Zeichen "BM" und die Bytes 28, 29 enthalten Bits pro Pixel.

Hier ist ein kleines Beispiel, in dem wir eine Datei in QByteArray lesen, ihr Format überprüfen und es in QPixmap laden, wenn OK.

#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; 
} 

Oder, wenn Sie nicht alles, was in den Speicher lesen möchten, können Sie eine Datei öffnen QFile verwenden, ifstream usw., überprüfen diese Bytes und schließen Sie es dann.

Verwandte Themen