tif格式标签(tag)查看工具:AsTiffTagViewer
TIF 图由四个部分组成:
图一、IFH 结构描述
IFH 数据结构包含3个成员共计 8 个字节, Byte order 成员可能是“MM”(0x4d4d)或“II”(0x4949), 0x4d4d 表示该 TIFF 图是摩托罗拉整数格式0x4949 表示该图是 Intel 整数格式; Version 成员总是包含十进制 42(0x2a), 它用于进一步校验该文件是否为 TIF 格式, 42 这个数并不是一般人 想象中的那样认为是 tif 软件的版本, 实际上, 42 这个数大概永远不会变化; 第三个成员是 IFD(接下来要说的第二个数据结构)相对文件开始 处的偏移量。
表一 、IFH结构描述
名称 | 字节数 | 数据类型 | 说明 |
Byteorder | 2 | Integer | TIF标记,其值为4D4D或4949 |
Version | 2 | Integer | 版本号,其值恒为2A00 |
Offset to first IFD | 4 | Long | 第一个IFD的偏移量 |
1、Byteorder:可能是H4D4D或H4949,H4D4D表示该图是摩托罗拉整数格式,H4949表示该图是Intel整数格式。
2、Version:总是H2A00,它可能是tif文件的版本,也可能用于进一步校验该文件是否为TIF格式。
3、Offset to first IFD:第一个IFD相对文件开始处的偏移量(因为可能会有多个顺序排列的IFD)。
IFD数据结构并不一定紧跟在IFH后面,相反,它常常位于第三部分图像数据的后面,即TIF图像文件的一般组织形式是:IFH——图像数据——IFD。
图二 、IFD 及 DE 结构描述
表二、IFD结构描述
名称 | 字节数 | 数据类型 | 说明 |
Directory Entry Count | 2 | Integer | 本IFD中DE的数量 |
Directory Entry(1) | 12 | DE | 简称DE,中文译义“目录项” |
Directory Entry(2) | 12 | DE | 简称DE,中文译义“目录项” |
…… | 12 | DE | 简称DE,中文译义“目录项” |
Directory Entry(N) | 12 | DE | 简称DE,中文译义“目录项” |
Offset to next IFD | 4 | Long | 下一个IFD的偏移量 |
1.Directory Entry Count:指出在该IFD中DE的个数;
2.Directory Entry:共12个字节,结构见表三。需要指出的是,DE的个数是不定的,因为每个DE只标识了图像的一个属性,那么这幅图像有N个属性就会有N个DE,用户甚至可添加自定义的标记属性,这就是为什么称TIF格式文件为“可扩充标记的文件”的原因。
3.Offset to next IFD Or NULL:下一个IFD相对于文件开始处的位置,这是一个链式构成。如果该数字为0,表示已经是最后一个IFD。当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然这个偏移量也会等于0。
IFD是TIF图中最重要的数据结构,它包含了一个 TIF文件中最重要的信息,一个 TIF 图可能有多个 IFD, 这说明文件中有多个图像, 每个 IFD 标识 1 个图像的基本属性。IFD结构中包含了三类成员,DirectoryEntry Count 指出该结构里面有多少个目录入口;接下来就是 N 个线性排列的DE序列, 数量不定( 这就是 为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量,标识下一个文件目录相对于文件开始处的位置,当然, 如果该 TIF 文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于 0;
表三 DE结构描述
名称 | 字节数 | 数据类型 | 说明 |
tag | 2 | Integer | 本属性的标签编号 |
type | 2 | Integer | 本属性值的数据类型 |
length | 4 | Long | 该类型数据的数量 |
valueOffset | 4 | Long | 属性值的存放偏移量 |
由DE标识的图像属性有:图像的大小、分辨率、是否压缩、像素的行列数、颜色深度(单色、16色、256色、真彩色)等等。其中:
1、tag:是该属性的标签编号(TagID),在图像文件目录中,它是按照升序排列的(但不一定是连续的)。这些编号在TIF格式官方白皮书中可以查到相应的含义,但遗憾的是,我们到哪儿可以找到官方白皮书呢?所以,笔者只能把网上能找得到资料(再结合自己的实验结果)罗列出来,见表四。
2、type:表示该属性数据的类型,一般认为TIF官方指定的有5种数据类型(但也有说12种数据类型的)。见表五。
3、length:该种类型的数据的个数,而不是某个数据的长度。
4、valueOffset:是tagID代表的变量值相对文件开始处的偏移量,但如果变量值占用的空间不多于4个字节(例如只有1个Integer类型的值),那么该值就直接存放在valueOffset中,没必要再另外指向一个地方了。
表四 DE中标签编号的含义
TagID | 属性名称 | type | 说明 |
0x0100 | 图像宽 | 0003 | |
0x0101 | 图像高 | 0003 | |
0x0102 | 颜色深度 | 0003 | 值=1为单色,=4为16色,=8为256色。如果该类型数据个数>2个,说明是真彩图像 |
0x0103 | 图像数据是否压缩 | 0003 | 值=05表示压缩 |
0x0106 | 图像是否采用反色显示 | 0003 | 值=01表示反色,否则表示不反色 |
0x0111 | 图像扫描线偏移量 | 0004 | 图像数据起始字节相对于文件开始处的位置 |
0x0116 | 图像扫描线的数量 | 0004 | 表示图像有几行扫描线,实际上等于图像高度 |
0x0117 | 图像数据字节总数 | 0003 | 如果不是偶数,那么实际存放时会在后面加0 |
0x011A | 水平分辩率偏移量 | 0005 | 常用计量单位是:像素/英寸 |
0x011B | 垂直分辩率偏移量 | 0005 | 常用计量单位是:像素/英寸 |
0x0131 | 生成该图像的软件名 | 0002 | 文本类型 |
0x0132 | 生成该图像的时间 | 0002 | 文本类型 |
0x0140 | 调色板偏移量 | 0003 | 256色和16色图像才有此属性,而且有连续2个调色板,但属性的length值只表示出1个调色板 |
1、“水平(垂直)分辩率”是分数型的属性,其值要占用8个字节,所以在valueOffset中存放的肯定是它的具体数值的偏移量,而不是数值本身。
2、“生成图像的软件名称”和“生成图像的时间”这两个字符型属性,它们的值所占用的空间也会大于4字节,所以在valueOffset中存放的也是它们的值的偏移量,而不是值本身。
3、“图像数据字节总数”一般是个偶数,如果是奇数,那么实际存放时会在后面加一个0,但这个0不会计算在字节总数之内。
表五 DE中的数据类型
type值 | 数据类型 | 说明 |
0001 | Byte | 8 位无标记整数 |
0002 | Ascii | 文本类型,7位Ascii码加1位二进制0 |
0003 | Integer | 16 位无标记整数 |
0004 | Long | 32 位无标记整数 |
0005 | RATIONAL | 分数类型,由两个Long组成,第1个是分子,第2个是分母 |
Tiff 6.0 | ||
0006 | SBYTE | 一个8位有符号(二进制补码)整数 |
0007 | UNDEFINED | 一个8位字节,可能包含任何内容,具体取决于字段的定义。 |
0008 | SSHORT | 一个16位(2字节)有符号(二进制补码)整数。 |
0009 | SLONG | 一个32位(4字节)有符号(二进制补码)整数。 |
000A | SRATIONAL | 两个SLONG的:第一个代表a的分子分数,第二个分母 |
000B | FLOAT | 单精度(4字节)IEEE格式。 |
000C | DOUBLE | 双精度(8字节)IEEE格式。 |
用系统自带的画图程序新建一个17*15的白色图像,另存为TIF文件,它的全部数据如下图:
绿色、粉色、青色表示:IFH
亮黄色背景:数据
橙色字:水平分辩率值
绿色字:垂直分辩率值。
浅蓝色字:颜色深度字
灰色背景:IFD个数0F 00= 15
表六为剩下的15个文件目录的解释和翻译
表六 、一个Tif文件实例的DE描述
顺号 | tag | type | length | valueOffset |
1 | FE 00 0x 00FE 未知属性值 |
04 00 0x 0004 Long |
01 00 00 00 0x 00000001 1 |
00 00 00 00 0x 00000000 0 |
2 | 00 01 0x 0100 图像宽 |
03 00 0x 0003 Integer |
01 00 00 00 0x 00000001 1 |
11 00 00 00 0x 00000011 17像素 |
3 | 01 01 0x 0101 图像高度 |
03 00 0x 0003 Integer |
01 00 00 00 0x 00000001 1 |
0F 00 00 00 0x 0000000F 15像素 |
4 | 02 01 0x 0102 颜色深度 |
03 00 0x 0003 Integer |
03 00 00 00 0x 00000003 数据个数为3(真彩色) |
48 00 00 00 0x 00000048 存放起始地址 0x 48 |
5 | 03 01 0x 0103 数据压缩形式 |
03 00 0x 0003 Integer |
01 00 00 00 0x 00000001 1 |
05 00 00 00 0x 00000005 5 为数据是压缩的 |
6 | 06 01 0x 0106 是否反色显示 |
03 00 0x 0003 Integer |
01 00 00 00 0x 00000001 1 |
02 00 00 00 0x 00000002 2为不反色显示 |
7 | 11 01 0x 0111 数据起始字节 |
04 00 0x 0004 Long |
01 00 00 00 0x 00000001 1 |
08 00 00 00 0x 00000008 8字节 |
8 | 15 01 0x 0115 未知 |
03 00 0x 0003 Integer |
01 00 00 00 0x 00000001 1 |
03 00 00 00 0x 00000003 3 |
9 | 16 01 0x 0116 图像扫描线 |
04 00 0x 0004 Long |
01 00 00 00 0x 00000001 1 |
0F 00 00 00 0000000F 15行 |
10 | 17 01 0x 0117 压缩数据个数 |
04 00 0x 0004 Long |
01 00 00 00 0x 00000001 1 |
2F 00 00 00 0x 0000002F 47字节 |
11 | 1A 01 0x 011A 水平分辩率 |
05 00 0x 0005 RATIONAL |
01 00 00 00 0x 00000001 1 |
38 00 00 00 0x 00000038 存放起始地址 0x38 |
12 | 1B 01 0x011B 垂直分辩率 |
05 00 0x 0005 RATIONAL |
01 00 00 00 0x 00000001 1 |
40 00 00 00 0x 00000040 存放起始地址 0x 40 |
13 | 1C 01 0x011C 未知 |
03 00 0x 0003 Integer |
01 00 00 00 00000001 1 |
01 00 00 00 00000001 1 |
14 | 28 01 0x0128 未知 |
03 00 0x 0003 Integer |
01 00 00 00 00000001 1 |
02 00 00 00 00000002 2 |
15 | 3D 01 0x013D 未知 |
03 00 0x 0003 Integer |
01 00 00 00 00000001 1 |
01 00 00 00 00000001 1 |
1、水平分辩率值存放在0038-003F,占用8个字节,这8个字节是:60 00 0000 01 00 00 00。由于它是分数类型,前4个字节是分子,其值为60000000,转换为10进制就是96,后4个字节是分母,其值是10000000,转换为10进制就是1,所以,分数值是:96/1,它表示每英寸96像素。
2、垂直水平分辩率值存放在0040-0047,请参照1进行分析。
3、颜色深度属性,它有3个Integer类型的值,共计6字节,所以valueOffset中存放的也是其值的偏移量。它的属性值存放在0048-004D,3个整形数据值都为8,表示这是一幅24位真彩色的图像。