1. 为什么你需要了解TIFF的“内脏”?
如果你处理过图像,尤其是来自专业相机、扫描仪或者遥感、医疗这类专业领域的图像,你肯定见过 .tiff 或 .tif 文件。它不像 JPEG 那样随处可见于网络,也不像 PNG 那样以透明背景著称,但在需要高质量、无损存储、并且要携带大量“元数据”的场景里,TIFF 几乎是无可替代的。
我刚开始接触图像处理时,也以为 TIFF 就是个“大号的、不压缩的图片”。直到有一次,我需要从一批卫星遥感 TIFF 文件中提取拍摄时间、地理坐标、传感器参数等信息,用普通的图像库打开只能看到像素,那些关键的附加信息怎么也读不出来。那时候我才意识到,TIFF 的精髓不在“图像数据”本身,而在包裹着数据的那些“标记”(Tag)里。你不了解它的内部结构,就相当于只拿到了一个产品的成品,却看不懂附带的详细说明书和质检报告。
所以,今天我们不谈高深的图像算法,就来做一次“外科手术”,亲手拆解一个 TIFF 文件,看看从最开头的 8 个字节,到后面错综复杂的目录项,到底是怎么组织起来的。我会用最直白的语言,配合一个真实的 TIFF 文件(我们拿经典的 lena.tiff 开刀),带你一步步走完解析的全过程。你会发现,理解了 IFH、IFD、DE 这些看似枯燥的结构,你就能自己写程序读取任何 TIFF 的元数据,甚至修改它、创造它。这对于做图像数据管理、计算机视觉数据预处理、或者开发专业图像工具的朋友来说,是一项非常实用的底层技能。
2. 庖丁解牛:认识TIFF的三大核心部件
你可以把 TIFF 文件想象成一栋有严格档案管理的大楼。这栋楼里不只有住户(图像像素),还有一本非常详细的住户花名册和建筑蓝图。这套管理体系,就是由三个核心部分构成的。
2.1 图像文件头(IFH):文件的“身份证”和“总目录”
任何 TIFF 文件的开头 8 个字节,一定是 图像文件头(Image File Header, IFH)。这 8 个字节虽然短,但信息至关重要,它决定了你该如何阅读这份文件。
IFH 的结构固定为三部分:
- 字节顺序(Byte Order, 2字节):这是你打开文件看到的第一个“密码”。它只有两种可能:
0x4949(ASCII 是II)或0x4d4d(ASCII 是MM)。II代表字节序是 小端序(Little-Endian),即 Intel 处理器常用的格式,低位字节在前。MM代表 大端序(Big-Endian),即摩托罗拉处理器常用的格式,高位字节在前。这个值直接决定了后面所有数字(比如长度、偏移量)该怎么解读。如果读错了,所有数字都会变得面目全非。 - 版本号(Version, 2字节):这几乎是一个“魔数”(Magic Number)。它永远是十进制
42(十六进制0x2A)。为什么是 42?据说源自《银河系漫游指南》里“生命、宇宙及一切的答案”。实际上,它就是 TIFF 格式的一个固定标识符,用于快速校验这个文件是不是一个合法的 TIFF 文件。如果你在正确字节序下读出的这个数不是 42,那这文件大概率已经损坏或者根本不是 TIFF。 - 首个IFD偏移量(Offset to first IFD, 4字节):这是一个指针,或者说是一个地址。它告诉解析程序:“你想找这栋楼的住户花名册(第一个图像文件目录 IFD)吗?它不在我后面紧跟着,它在从文件开头算起的第 N 个字节那里。” 这个设计非常巧妙,它使得 TIFF 的元数据(IFD)和图像数据可以灵活地排列,甚至可以把图像数据放在 IFD 前面。
实战一下:我们用十六进制编辑器打开 lena.tiff,看最开始的 8 个字节:
4D 4D 00 2A 00 0C 00 08
- 前两个字节
4D 4D对应 ASCII 字符MM,所以这是大端序文件。 - 接着两个字节
00 2A,在大端序下就是0x002A,十进制正是 42。验证通过。 - 最后四个字节
00 0C 00 08,在大端序下解读为0x000C0008,这是一个很大的数字(786440字节)。等等,这个文件总共才几百KB,这个偏移量显然不对?这里有个关键点:在大端序下,这四个字节要作为一个整体0x000C0008来解读,而不是拆成两个0x000C和0x0008。实际上,这个值应该是0x00000008?让我们重新计算:00 0C 00 08作为 32 位整数,值是(0x00<<24) + (0x0C<<16) + (0x00<<8) + 0x08 = 0x000C0008。这看起来确实很大。但别急,我们继续往下看,可能这个文件的结构比较特殊,或者我们的理解有误。实际上,更常见的值是像0x00000008这样的小数字,指向文件靠前的位置。我们暂且记住这个值0x000C0008。
2.2 图像文件目录(IFD):管理的“核心枢纽”
跟着 IFH 给出的地址,我们跳转到文件的指定位置,找到的就是 图像文件目录(Image File Directory, IFD)。你可以把 IFD 理解为一栋楼的“物业管理中心”,这里存放着这栋楼(这张图片)所有关键信息的索引。
一个 IFD 的结构是这样的:
- 目录项数量(Directory Entry Count, 2字节):首先告诉你,这个“管理中心”里有多少条记录(即有多少个 DE)。比如
00 0A表示有 10 条。 - 目录项序列(Directory Entries):紧接着就是连续排列的 N 个 DE,每个 DE 占 12 个字节。这 N 条记录就是这张图片的所有属性,如图像宽、高、色彩空间


1万+

被折叠的 条评论
为什么被折叠?



