1. TIFF概述
TIFF是Tagged
Image File Format的缩写。在现在的标准中,只有TIFF存在, 其他的提法已经舍弃不用了。做为一种标记语言,TIFF与其他文件格式最大的不同在于除了图像数据,它还可以记录很多图像的其他信息。它记录图像数据的方式也比较灵活, 理论上来说, 任何其他的图像格式都能为TIFF所用, 嵌入到TIFF里面。比如JPEG
, Lossless JPEG
, JPEG2000
和任意数据宽度的原始无压缩数据都可以方便的嵌入到TIFF
中去。由于它的可扩展性, TIFF在数字影像、遥感、医学等领域中得到了广泛的应用。TIFF文件的后缀是.tif
或者.tiff
。
2. TIFF文件构成
2.1 概述
谈到TIFF文件结构,这里不得不要提出三个关键词:IFH
(图像文件头)、IFD
(图像文件目录)和DE
(目录项)。其中,IFH
包含三项功能,分别是字节顺序标志位、TIFF标志位和第一个IFD
偏移量。最后一个功能负责指向IFD
的开端。当然,从IFH
到第一个IFD
还有一段字节,小编表示还没弄明白。对于IFD
与DE
,他们是包含的关系。一个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
今天的文章TIFF文件结构详解分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/72747.html