TIFF是Tagged Image File Format的缩写。作为一种标记语言,TIFF与其他文件格式最大的不同在于除了图像数据,它还可以记录很多图像的其他信息。 理论上来说, 任何其他的图像格式都能为TIFF所用, 嵌入到TIFF里面。比如JPEG, Lossless JPEG, JPEG2000和任意数据宽度的原始无压缩数据都可以方便的嵌入到TIFF中去。在存储真彩色图像时和BMP格式一样,直接存储RGB三原色的浓度值而不使用彩色映射(调色板)。
TIF的全面性也产生了不少问题,它的包罗万象造成结构较为复杂,变体很多,兼容性较差,它需要大量的编程工作来全面译码。例如,TIF图像数据可以用几种不同的方法压缩,用一个程序来读出所有的TIF几乎是不可能的。
TIFF文件由三部分组成:
IFH 数据结构包含3个成员共计 8 个字节。
名称 | 字节数 | 数据类型 | 说明 |
---|---|---|---|
Byteorder | 2 | int | Byte order 成员可能是“MM”(0x4d4d)或“II”(0x4949), 0x4d4d 表示该 TIFF 图是摩托罗拉整数格式,0x4949 表示该图是 Intel 整数格式 |
Version | 2 | int | Version 成员总是包含十进制 42(0x2a), 它用于进一步校验该文件是否为 TIF 格式, 42 这个数并不是一般人 想象中的那样认为是 tif 软件的版本, 实际上, 42 这个数大概永远不会变化 |
Offset to first IFD | 4 | long | IFD(接下来要说的第2个数据结构)相对文件开始处的偏移量。 |
‘MM’高位在前,'II’低位在前
一个TIFF文件中至少有1个IFD,一个IFD里至少有一个DE.
IFD是TIF图中最重要的数据结构,它包含了一个 TIF文件中最重要的信息。
一个 TIF 图可能有多个 IFD, 这说明文件中有多个图像, 每个 IFD 标识 1 个图像的基本属性。
IFD结构中包含了三类成员,DirectoryEntry Count 指出该结构里面有多少个目录入口;接下来就是 N 个线性排列的DE序列, 数量不定,每个DE标识了图像的某一个属性;最后就是一个偏移量,标识下一个文件目录相对于文件开始处的位置,当然, 如果该 TIF 文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于 0;
名称 | 字节数 | 数据类型 | 说明 |
---|---|---|---|
Directory Entry Count | 2 | int | 本IFD中DE(Directory Entry,目录项)的数量 |
Directory Entry(1) | 12 | DE(DE结构图中已画出) | 每个DE标识了图像的一个属性 |
Directory Entry(2) | 12 | ||
… | |||
Directory Entry(n) | 12 | ||
Offset to next IFD | 4 | long | 下一个IFD的偏移量 |
我们可以看到,这种IFD中有一种自建的数据结构DE(见右边的表)。需要指出的是,DE的个数是不定的,因为每个DE只标识了图像的一个属性,那么这幅图像有N个属性就会有N个DE,用户甚至可添加自定义的标记属性,这就是为什么称TIF格式文件为“可扩充标记的文件”的原因。
我们接下来就详细研究一下DE。
由DE标识的图像属性有:图像的大小、分辨率、是否压缩、像素的行列数、颜色深度(单色、16色、256色、真彩色)等等。
名称 | 字节数 | 数据类型 | 说明 |
---|---|---|---|
tag | 2 | int | 本属性的标签编号 |
type | 2 | int | 本属性的数据类型 |
length | 4 | long | 该类型数据的数量,而不是某个数据的长度 |
value/valueOffset | 4 | long | 属性值本身,或属性值的存放偏移量(图上有虚线箭头!),大于4字节就需要用指针 |
这里挑选了一些常用tags进行翻译列出:
TagID | 属性名称 | 说明 |
---|---|---|
0x0100 | 图像宽 | |
0x0101 | 图像高 | |
0x0102 | 颜色深度 | 值=1为单色,=4为16色,=8为256色。如果该类型数据个数>2个,说明是真彩图像 |
0x0103 | 图像数据是否压缩 | |
0x0140 | 调色板偏移量 | 值=1为单色,=4为16色,=8为256色。如果该类型数据个数>2个,说明是真彩图像 |
有些值,如水平(垂直)分辩率是分数型的属性,其值要占用8个字节,占用空间大,故存储的是其具体数值的偏移量。
这些数据可能是压缩的,也可能是未压缩的。如果经过压缩,那么压缩算法又有许多种,所以,图像数据是TIF文件中最为复杂的部分,暂还没有单个程序能译出所有的压缩算法。
值得注意的是,由于IFH、IFD、DE中存在各种各样的指针,因此,有时这些元数据甚至可能出现在数据后。一般的数据结构是:
数据组织结构(上至下) |
---|
IFH(含有指向IFD的偏移量,偏移量中间夹着的就有图像数据) |
图像数据 |
IFD和DE中指针指向的值 |
IFD |
一般要根据指针来判断具体位置。
我找到了一张lena.tiff如下图:
对该图像进行分析.
由该文件的IFH得知该图像的第一个IFD所在位置,然后由DE计数器得知该图像的10个属性,根据指针便宜位置可以访问到DE;又知该TIFF只有一个IFD,即一幅图像。
标出的棕色部分即为IFH部分。查阅数据定义,可以知道:
名称 | 字节数 | 该图像的值 | 意义 |
---|---|---|---|
Byteorder | 2 | 4D 4D | 成员是“MM”(0x4d4d) 表示该 TIFF 图是摩托罗拉整数格式 |
Version | 2 | 00 2A | 十进制的42,永恒不变 |
Offset to first IFD | 4 | 00 0C 00 08 | 第一个IFD,从文件开始处的偏移量 |
接下来我们按照指针给出的第一个IFD的位置。
棕色部分开始标出的就是IFD数据。
名称 | 字节数 | 值 | 意义 |
---|---|---|---|
Directory Entry Count | 2 | 00 0A | 有10个DE |
Directory Entry(1) | 12 | 00FE00040000000100000000 | 见 表 DE1 |
Directory Entry(1) | 12 | 010000030000000102000000 | 见 表 DE2 |
Directory Entry(1) | 12 | 010100030000000102000000 | 见 表 DE3 |
Directory Entry(1) | 12 | 0102000300000003000C0086 | 见 表 DE4 |
Directory Entry(1) | 12 | 010300030000000100010000 | 见 表 DE5 |
Directory Entry(1) | 12 | 010600030000000100020000 | 见 表 DE6 |
Directory Entry(1) | 12 | 011100040000000100000008 | 见 表 DE7 |
Directory Entry(1) | 12 | 011500030000000100030000 | 见 表 DE8 |
Directory Entry(1) | 12 | 0117000400000001000C0000 | 见 表 DE9 |
Directory Entry(1) | 12 | 011C00030000000100010000 | 见 表 DE10 |
Offset to next IFD | 4 | 00 00 | 这是最后一个IFD |
DE1:
名称 | 字节数 | 值 | 意义 |
---|---|---|---|
tag | 2 | 00 FE | NewSubfileType: 254 新的子文件类型标识。用比特来标识图像的类型,Bit0如果是1代表缩略图,Bit1如果是1代表多页图像中的某一页,Bit2如果是1代表它是透明度掩码图像.其余的位数暂时没有定义。 |
type | 2 | 00 00 | long |
length | 4 | 1 | 只有一个参数 |
value/valueOffset | 4 | 0 | 属性值本身是0。该图像Bit0,1,2都不是1 |
剩余九个DE以类似的方法读取,这里直接读取后总结每个DE的意义。(参考了很久很久的手册!!!!辛苦了!!!!!)
Which DE | 意义 |
---|---|
DE2 | 图像宽度为512 |
DE3 | 图像长度为512 |
DE4 | R\G\B三通道的位深度(原文:BitsPerSample,比特每样点)都是2048 |
DE5 | 压缩类型为1,无压缩(Uncompressed) |
DE6 | PhotometricInterpretation值为第2类,即颜色空间为RGB |
DE7 | 每个Strip偏移量为8 |
DE8 | 每像素样点数为3 |
DE9 | 每个Strip的长度为786432 |
DE10 | PlanarConfiguration(How the components of each pixel are stored.),我理解的是每个像素点的存储格式,是BGR,RGB,或甚至是GBR?? 值=1 |
DE9和DE10后各有1字节填充。
这些元素永远存在于图像格式中,只是他们组织数据的方式有所不同。有些格式非常规范;有些格式复杂,却带来了非常大的灵活度。