2017-07-23 26 views
0

Ich versuche, einen TGA-Dateiheader mit Qt QDataStream zu lesen. Ich habe die folgende Struktur aus den Spezifikationen mit festen Typen:TGA lesen Header mit QDataStream

#pragma pack(push, 1) 
/* TGA header */ 
struct tga_header_t 
{ 
    quint8 id_lenght;   /* size of image id */ 
    quint8 colormap_type;  /* 1 is has a colormap */ 
    quint8 image_type;   /* compression type */ 

    /* Color Map Specification */ 
    quint16 cm_origin;   /* colormap origin */ 
    quint16 cm_length;   /* colormap length */ 
    quint8 cm_size;    /* colormap size */ 

    /* Image Specification */ 
    quint16 x_origin;   /* bottom left x coord origin */ 
    quint16 y_origin;   /* bottom left y coord origin */ 
    quint16 width;    /* picture width (in pixels) */ 
    quint16 height;    /* picture height (in pixels) */ 
    quint8 pixel_depth;  /* bits per pixel: 8, 16, 24 or 32 */ 
    quint8 image_descriptor; /* 24 bits = 0x00; 32 bits = 0x80 */ 
}; 
#pragma pack(pop) 

Ich öffne eine Datei mit QFile dann mit ihm als ein solches QDataStream konstruieren:

QFile file(path); 
tga_header_t header; 

file.open(QIODevice::ReadOnly); 
QDataStream stream(&file); 
stream >> header.id_lenght >> 
      header.colormap_type >> 
      header.image_type >> 
      header.cm_origin >> 
      header.cm_length >> 
      header.cm_size >> 
      header.x_origin >> 
      header.y_origin >> 
      header.width >> 
      header.height >> 
      header.pixel_depth >> 
      header.image_descriptor; 
qDebug() << header.id_lenght << "id_lenght" << 
      header.colormap_type << "colormap_type" << 
      header.image_type << "image_type" << 
      header.cm_origin << "cm_origin" << 
      header.cm_length << "cm_length" << 
      header.cm_size << "cm_size" << 
      header.x_origin << "x_origin" << 
      header.y_origin << "y_origin" << 
      header.width << "width" << 
      header.height << "height" << 
      header.pixel_depth << "pixel_depth" << 
      header.image_descriptor << "image_descriptor" << 
      "SIZE:" << sizeof(header); 

Das Problem mit Breite und Höhe I erhalten :

0 id_lenght 0 colormap_type 2 image_type 0 cm_origin 0 cm_length 0 cm_size 0 x_origin 0 y_origin 22021 width 3 height 24 pixel_depth 0 image_descriptor SIZE: 18 

und ich sollte 1366 und 768. bekommen Wenn ich die Datei HexDump erhalte ich:

0000000 0000 0002 0000 0000 0000 0000 0556 0300 
0000010 0018 0000 0000 0000 0000 0000 0000 0000 

Das ist komisch, weil es am Anfang ein zusätzliches Byte hat und ein anderes irgendwo zwischen 0x0002 und 0x0556 fehlt.

Update:
Mit fstream funktioniert, korrigieren Sie mich so, wenn ich falsch bin, aber ich denke, die << Betreiber nicht, wie ich es erwartet funktioniert zu (lesen Sie nur die Größe notwendig, die Struktur Variable zu füllen).

stream.read((char*)&header.id_lenght, sizeof(header.id_lenght)); 
    stream.read((char*)&header.colormap_type, sizeof(header.colormap_type)); 
    stream.read((char*)&header.image_type, sizeof(header.image_type)); 
    stream.read((char*)&header.cm_origin, sizeof(header.cm_origin)); 
    stream.read((char*)&header.cm_length, sizeof(header.cm_length)); 
    stream.read((char*)&header.cm_size, sizeof(header.cm_size)); 
    stream.read((char*)&header.x_origin, sizeof(header.x_origin)); 
    stream.read((char*)&header.y_origin, sizeof(header.y_origin)); 
    stream.read((char*)&header.width, sizeof(header.width)); 
    stream.read((char*)&header.height, sizeof(header.height)); 
    stream.read((char*)&header.pixel_depth, sizeof(header.pixel_depth)); 
    stream.read((char*)&header.image_descriptor, sizeof(header.image_descriptor)); 

Mit QDataStream :: readRawData funktioniert auch:

stream.readRawData((char*)&header.id_lenght, sizeof(header.id_lenght)); 
    stream.readRawData((char*)&header.colormap_type, sizeof(header.colormap_type)); 
    stream.readRawData((char*)&header.image_type, sizeof(header.image_type)); 
    stream.readRawData((char*)&header.cm_origin, sizeof(header.cm_origin)); 
    stream.readRawData((char*)&header.cm_length, sizeof(header.cm_length)); 
    stream.readRawData((char*)&header.cm_size, sizeof(header.cm_size)); 
    stream.readRawData((char*)&header.x_origin, sizeof(header.x_origin)); 
    stream.readRawData((char*)&header.y_origin, sizeof(header.y_origin)); 
    stream.readRawData((char*)&header.width, sizeof(header.width)); 
    stream.readRawData((char*)&header.height, sizeof(header.height)); 
    stream.readRawData((char*)&header.pixel_depth, sizeof(header.pixel_depth)); 
    stream.readRawData((char*)&header.image_descriptor, sizeof(header.image_descriptor)); 
+0

'stream >> header.id_lenght; ... ist das ein Tippfehler? Ich glaube, es sollte "Stream >> header.id_length >> ..." sein. – DimChtz

+0

Ja das war ein Tippfehler (korrigiert) –

Antwort

0

Die Daten in Ordnung ist. Ihr PC interpretiert 16-Bit-Wörter als Little-Endian. In der Datei werden sie als Big Endian gespeichert.

Für alle 16-Bit-Typen sollten Sie Low/High-Bytes tauschen. Sie könnten auch die Hilfsfunktionen von Qt: http://doc.qt.io/qt-4.8/qtendian.html