目录
一、TIFF文件基本格式
此处对TIFF文件格式的基本组成做一个宏观介绍,记录一下我在初次解析该格式文件时所产生的一些误解,也让大家避一些坑,可以更加快速直观的对TIFF文件的数据存储结构有一个基本了解。涉及到具体的格式说明网上已经有很多详细的介绍,此处不再赘述。TIFF文件基本格式由4部分组成,分别是:
- 文件头(IFH)
- 图像目录(IFD)
- 属性信息(DE)
- 数据实体
1)文件头(IFH)
一个TIFF文件只有一个文件头,就是文件开始的8个字节。最后四个字节是一个int型的整数,指向第一个IFD的起始位置,也叫偏移量。这个偏移量指的是相对于文件头的偏移字节数,比如若该偏移量取值为8,则表示第一个IFD结构的数据在文件中存放的起始位置为第9个字节(含)开始,在字节数组中的索引号为8。所以,若需要读取出第一个IFD的信息,从文件中第9个字节往后开始读取即可。
struct IFH
{
qint16 byteOrder;
qint16 version;
qint32 firstIFD;
};
2)图像目录(IFD)
图像目录中包含了一副图像的全部属性信息,他不是一个定长结构,其字节数长度根据图像属性信息而定。一个TIFF格式的文件可以有多个IFD,也就是说一个TIFF文件可以存放多副图像,这也是为什么打开有些TIFF格式的文件可以浏览到多幅图像的原因。虽然IFD的长度不定,但存储结构是一致的,他的前两个字节是一个short短整型数据,表示该IFD中存放了多少个DE;他的最后4个字节是一个int型数据,表示下一个IFD存放的起始位置,也就是偏移量(同上),若没有其他图像了,则该偏移量值为0。在这两个数据之间是依次按序存放的DE结构数据,DE的个数就是由IFD的前两个字节决定的。
struct IFD
{
qint16 DEnumber;//
QVector<DE> DEs;
qint32 nextIFDOffset;
};
3)属性信息(DE)
属性信息(DE)正式名称也叫目录项,但我更倾向于理解他为图像的属性信息结构,因为图像的不同属性信息在这里表达,一个DE表征了一个图像属性,如图像高度、宽度、图像分片存放时每个片段的大小等。他有固定的长度12字节,前2个字节就是这个属性的标识号,不同的标识号表示不同的属性,具体对应值含义可查阅相关资料。依次后面2个字节表示存放该属性值所采用的数据类型,再后面4个字节表示存放该属性取值的个数,注意不是属性值的字节长度,最后4个字节表示该属性值。此处需要注意的是,如果4个字节存不下该属性值,则这4个字节表示的是该属性值的存放位置,也就是偏移量。如何判断此处存放的是属性值还是