带有QDataStream的TGA读取标头
TGA reading header with QDataStream
我正在尝试使用Qt QDataStream读取TGA文件头。我从固定类型的规范中具有以下结构:
#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
这很奇怪,因为它在开头有一个额外的字节,而在0x0002
和0x0556
之间缺少另一个字节。
更新:
使用 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));
数据正常。你的电脑将 16 位字解释为小端序。在文件中,它们存储为大端序。
对于所有 16 位类型,您应该交换低/高字节。您也可以使用 Qt: http://doc.qt.io/qt-4.8/qtendian.html 中的辅助函数
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 带有QDataStream的TGA读取标头
- 读取 TGA 显示空值而不是颜色数据