TIFF文件结构详解「建议收藏」

TIFF文件结构详解「建议收藏」1.TIFF概述TIFF是TaggedImageFileFormat的缩写。在现在的标准中,只有TIFF存在,其他的提法已经舍弃不用了。做为一种标记语言,TIFF与其他文件格式最大的不同在于除了图像数据,它还可以记录很多图像的其他信息。它记录图像数据的方式也比较灵活,理论上来说,任何其他的图像格式都能为TIFF所用,嵌入到TIFF里面。比如JPEG,LosslessJPEG,JPEG2000和任意数据宽度的原始无压缩数据都可以方便的嵌入到TIFF中去。由于它的可扩展性,TIFF在数

1. TIFF概述

TIFF是Tagged Image File Format的缩写。在现在的标准中,只有TIFF存在, 其他的提法已经舍弃不用了。做为一种标记语言,TIFF与其他文件格式最大的不同在于除了图像数据,它还可以记录很多图像的其他信息。它记录图像数据的方式也比较灵活, 理论上来说, 任何其他的图像格式都能为TIFF所用, 嵌入到TIFF里面。比如JPEGLossless JPEGJPEG2000和任意数据宽度的原始无压缩数据都可以方便的嵌入到TIFF中去。由于它的可扩展性, TIFF在数字影像、遥感、医学等领域中得到了广泛的应用。TIFF文件的后缀是.tif或者.tiff

2. TIFF文件构成

2.1 概述

谈到TIFF文件结构,这里不得不要提出三个关键词:IFH(图像文件头)、IFD(图像文件目录)和DE(目录项)。其中,IFH包含三项功能,分别是字节顺序标志位、TIFF标志位和第一个IFD偏移量。最后一个功能负责指向IFD的开端。当然,从IFH到第一个IFD还有一段字节,小编表示还没弄明白。对于IFDDE,他们是包含的关系。一个TIFF文件可以有多个IFD。而每个IFD有记录了DE的个数以及DE的详细内容,最后还记录了下一个IFD的偏移量。在此,大家可以想一下为什么这里记录的是偏移量,而不是直接下一个IFD。下图就是一个tif文件的详细结构。

在这里插入图片描述

2.2 IFH(图像文件头)

根据上图可知IFH包括三部分组成,详细介绍如下:

2.2.1 字节顺序标志位

占用两个字节(byte 0-1),值为II或者MM。II表示小字节在前, 又称为little-endian。MM表示大字节在前,又成为big-endian

2.2.2 TIFF标志位

占用两个字节(byte 2-3),一般都是42。

2.2.3 第一个IFD的偏移量

占用两个字节(byte 4-7),可以在任意位置, 但必须是在一个字的边界,也就是说必须是2的整数倍。需要注意的是,这里是IFD的偏移量。也就是说,从这个位置到第一个IFD中间还有一些字节。

2.3 IFD(图像文件目录)

图像文件目录也包括三部分组成。

2.3.1 DE个数

占用两个字节(byte 0~1),当然这里的0表示的是相对位置,表示此IFD包含多少个DE,假设数据为n个。

2.3.2 DE的详细描述

占用n * 12 个字节,这一部分是DE的详细描述,每个DE占用12个字节(详细后面会说),所以n个DE总共占用2~(n*12+1)。这里可以想一下为什么要加1。

2.3.3 下一个IFD偏移量

占用4个字节,IFD偏移量,如果没有,则为0。

2.4 DE(图像目录项)

这一项有四部分组成,详细介绍如下。

2.4.1 TAG标识符

还记得TIFF的全程吗?不错,都出现了TAG。足以见到这一部分的重要性。这可以说是数据项的唯一标识符。关于的tag的详细说明见下表。

名称 简短描述
十进制码 十六进制码
254 00FE NewSubfileType 新的子文件类型标识 LONG 长度为1
用比特来标识图像的类型
Bit0如果是1代表缩略图
Bit1如果是1代表多页图像中的某一页
Bit2如果是2代表它是透明度掩码图像
其余的位数暂时没有定义。与SubfileType的是,此Tag
用比特位来区分文件类型而不是用值来区分
255 00FF SubfileType 子文件类型标识SHORT长度为1
1 全分辨率图像
2 缩小分辨率的图像
3 多页图像的某一页
过时的Tag,已不再使用
256 0100 ImageWidth 图像宽度 SHORT或者LONG 长度为1
257 0101 ImageLength 图像高度 SHORT或者LONG 长度为1
258 0102 BitsPerSample 每个分量的Bit数 SHORT 长度为SamplesPerPixel
259 0103 Compression 压缩类型 SHORT 长度为1
随着TIFF的不断扩张,目前支持多达几十种的压缩方式。就我个人看来,最需要关注的有以下两个值:
Compression=1: 没有压缩
Compression=7:JPEG压缩。 如果是RGB图像并且SamplesPerPixel=3,则是标准的有损JPEG压缩。如果是CFA图像,则是Lossless JPEG
262 0106 PhotometricInterpretation 颜色空间 SHORT 长度为1
0 = WhiteIsZero. 应用于灰度或者二值图像, 0对应最亮灰度.
1 = BlackIsZero. 应用于灰度或者二值图像. 0对应最暗灰度。
Compression=2 = RGB. 正常RGB图像,存储顺序为R,G,B.
3 = Palette color. 索引图像, ColorMap必须定义,SamplesPerPixel必须1.
32803 = CFA (Color Filter Array)
263 0107 Threshholding 定义了转换成二值图像的阈值,忽略之
264 0108 CellWidth The width of the dithering or halftoning matrix used to create a dithered or halftoned bilevel file.
265 0109 CellLength The length of the dithering or halftoning matrix used to create a dithered or halftoned bilevel file.
266 010A FillOrder 在同一字节中的逻辑顺序。一般不做定义,要定义的话建议用1
270 010E ImageDescription 字符串, 对图像的描述
271 010F Make 字符串, 生产厂商的描述
272 0110 Model 字符串
273 0111 StripOffsets 每个Strip的偏移量 SHORT或者LONG,N = StripsPerImage for PlanarConfiguration equal to 1; N = SamplesPerPixel * StripsPerImage for PlanarConfiguration equal to 2
274 0112 Orientation The orientation of the image with respect to the rows and columns.
277 0115 SamplesPerPixel 每个象素的通道数 SHORT 长度为1
278 0116 RowsPerStrip 每个Strip有多少行 SHORT或者LONG 长度为1。
Default是无限大
StripsPerImage = floor ((ImageLength + RowsPerStrip - 1) / RowsPerStrip).
279 0117 StripByteCounts 每个Strip的长度 SHORT或者LONG
N = StripsPerImage for PlanarConfiguration equal to 1; N = SamplesPerPixel * StripsPerImage for PlanarConfiguration equal to 2
280 0118 MinSampleValue The minimum component value used.
281 0119 maxsamplevalue The maximum component value used.
282 011A XResolution The number of pixels per ResolutionUnit in the ImageWidth direction.
283 011B YResolution The number of pixels per ResolutionUnit in the ImageLength direction.
284 011C PlanarConfiguration How the components of each pixel are stored.
288 0120 FreeOffsets For each string of contiguous unused bytes in a TIFF file, the byte offset of the string.
289 0121 FreeByteCounts For each string of contiguous unused bytes in a TIFF file, the number of bytes in the string.
290 0122 GrayResponseUnit The precision of the information contained in the GrayResponseCurve.
291 0123 GrayResponseCurve For grayscale data, the optical density of each possible pixel value.
296 0128 ResolutionUnit The unit of measurement for XResolution and YResolution.
305 0131 Software Name and version number of the software package(s) used to create the image.
306 0132 DateTime Date and time of image creation.
315 013B Artist Person who created the image.
316 013C HostComputer The computer and/or operating system in use at the time of image creation.
320 0140 ColorMap 调色板
338 0152 ExtraSamples Description of extra components.
33432 8298 Copyright Copyright notice.

2.4.2 数据类型

占字节数(2-3),数据类型。在TIFF6.0中,定义了12种数据类型,分别是:

  • 1 = BYTE 8-bit unsigned integer.
  • 2 = ASCII 8-bit byte that contains a 7-bit ASCII code; the last byte
    must be NUL (binary zero).
  • 3 = SHORT 16-bit (2-byte) unsigned integer.
  • 4 = LONG 32-bit (4-byte) unsigned integer.
  • 5 = RATIONAL Two LONGs: the first represents the numerator
  • 6 = SBYTE An 8-bit signed (twos-complement) integer.
  • 7 = UNDEFINED An 8-bit byte that may contain anything, depending on
    the definition of the field.
  • 8 = SSHORT A 16-bit (2-byte) signed (twos-complement) integer.
  • 9 = SLONG A 32-bit (4-byte) signed (twos-complement) integer.
  • 10 = SRATIONAL Two SLONG’s: the first represents the numerator of a
    fraction, the second the denominator.
  • 11 = FLOAT Single precision (4-byte) IEEE format.
  • 12 = DOUBLE Double precision (8-byte) IEEE format.

2.4.3 数量

占用4个字节数(4-7)。通过类型和数量可以确定存储此TAG的数据需要占据的字节数

2.4.4 数值或指针

占用4个字节(8-11), 如果占用的字节数少于4, 则数据直接存于此。 如果超过4个,则这里存放的是指向实际数据的指针。

3. 实例说明

下面创建了一个5*3像素的tif文件。我们可以详细分析一下:

在这里插入图片描述

3.1 分析IFH

IFH共占用8个字节,根据上图可知为:49 49 2a 00 3a 00 00 00

  • 字节顺序标志位(49 49

    49转换为16进制为73,对应字母为I,即标志位位II,也就是小字节在前。

  • TIFF标志位(2a 00)

    表示42。

  • IFD偏移量(3a 00 00 00)

    所以我们直接跳到3a查询第一个IFD,也就是第4行(00000030),第a列,所得数值为0f

3.2 IFD

  • DE个数(0f 00)

    说明有15个DE。接下来,我们分析几个DE。

3.3 DE

我们复习一下DE组成,分为TAG(2)、数据类型(2)、数量(4)、数值或指针(4)。

这里需要说明的是字节是要按照从右向左方向读取。

例如有两个字节(00 10),那么应该编译成01 00。

3.3.1 第一个DE(起始3c)

  • TAG(fe 00)

    通过查阅上表为NewSubfileType。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(00 00 00 00)

    数值为0,具体含义参见上表或者链接地址说明。

3.3.2 第二个DE(起始48)

  • TAG(00 01)

    通过查阅上表代码(0100)为ImageWidth。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(00 00 00 05)

    数值为5,印证了上面说的这个tif宽为5个像素。

3.3.3 第三个DE(起始54)

  • TAG(01 01)

    通过查阅上表代码(0101)为ImageLength。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(00 00 00 03)

    数值为3,印证了上面说的这个tif高为3个像素。

3.3.4 第四个DE(起始60)

  • TAG(02 01)

    通过查阅上表代码(0102)为BitsPerSample。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(03 00 00 00)

    所以数量为3

  • 数值(f4 00 00 00)

    数值为f4。

3.3.5 第五个DE(起始6c)

  • TAG(03 01)

    通过查阅上表代码(0103)为Compression。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(05 00 00 00)

    数值为5,5 = LZW

3.3.6 第六个DE(起始78)

  • TAG(06 01)

    通过查阅上表代码(0106)为PhotometricInterpretation。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(02 00 00 00)

    数值为2,2 = RGB. 正常RGB图像,存储顺序为R,G,B.

3.3.7 第七个DE(起始84)

  • TAG(11 01)

    通过查阅上表代码(0111)为StripOffsets。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(08 00 00 00)

    数值为8.

3.3.8 第八个DE(起始90)

  • TAG(15 01)

    通过查阅上表代码(0115)为SamplesPerPixel。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(03 00 00 00)

    数值为3,也就是RGB三个通道。

3.3.9 第九个DE(起始9c)

  • TAG(16 01)

    通过查阅上表代码(0116)为RowsPerStrip。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(03 00 00 00)

    数值为3,这里的3指的高为3个像素。

3.3.10 第十个DE(起始a8)

  • TAG(17 01)

    通过查阅上表代码(0117)为StripByteCounts。

  • 数据类型(04 00)

    通过查询数据类型表格可知,数据类型为4 = LONG 32-bit (4-byte) unsigned integer.

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(32 00 00 00)

    数值为50

3.3.11 第十一个DE(起始b4)

  • TAG(1a 01)

    通过查阅上表代码(011a)为XResolution。

  • 数据类型(05 00)

    通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(fa 00 00 00)

    数值为fa

3.3.12 第十二个DE(起始c0)

  • TAG(1b 01)

    通过查阅上表代码(011b)为YResolution。

  • 数据类型(05 00)

    通过查询数据类型表格可知,数据类型为5 = RATIONAL Two LONGs: the first represents the numerator

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(02 01 00 00)

    数值为102

3.3.13 第十三个DE(起始cc)

  • TAG(1c 01)

    通过查阅上表代码(011c)为PlanarConfiguration。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(01 00 00 00)

    数值为1

3.3.14 第十四个DE(起始d8)

  • TAG(28 01)

    通过查阅上表代码(0128)为ResolutionUnit。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(02 00 00 00)

    数值为2

3.3.15 第十五个DE(起始e4)

  • TAG(3d 01)

    通过查阅上表代码(013d)为****。

  • 数据类型(03 00)

    通过查询数据类型表格可知,数据类型为3 = SHORT 16-bit (2-byte) unsigned integer

  • 数量(01 00 00 00)

    所以数量为1

  • 数值(02 00 00 00)

    数值为2

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/209548
0
   

发表评论