2017-07-23 118 views
0

我想读Qt QDataStream的TGA文件标题。我已经从规格如下结构与固定类型:TGA阅读标题与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) 

我打开与一个QFile一个文件然后构造操作QDataStream用它作为这样:

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); 

问题是与宽度和高度我得到:

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 

我应该得到1366和768。如果我进制打印文件获得:

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

这很奇怪,因为它在开始时有一个额外的字节,而另一个在0x00020x0556之间缺少某处。

更新:
使用fstream的作品,所以纠正我,如果我错了,但我想,我期待它(只读所需的尺寸,以填补结构变量)<<操作不起作用。

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)); 

使用QDataStream :: readRawData也可以工作:

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; ......这是一个错字吗?我相信它应该是'stream >> header.id_lenght >> ...'。 – DimChtz

+0

是的,这是一个错字(更正) –

回答

0

的数据确定。你的电脑将16位单词解释为little-endian。在文件中,它们被存储为大端序列。

对于所有16位类型,您应该交换低/高字节。你也可以使用Qt的帮助函数:http://doc.qt.io/qt-4.8/qtendian.html