数据压缩第二周作业
TIFF格式概述
TIFF(Tagged Image File Format):
标记文件格式
,是一种灵活的
位图
格式,TIFF位图文件默认的文件扩展名是
tif或者tiff
。(注意,tif和tiff可以理解为文件格式相同)
特点
-
在刚开始,TIFF只支持二值图像,后来逐渐支持灰阶图像和彩色图像。现在可以将TIFF分为
四种
类型:TIFF-B,双色;TIFF-G,黑白灰度;TIFF-P,带调色板的彩色图形;TIFF-R,适合RGB色彩的图形。 - 支持256色、24位真彩色、32位色、48位色等多种色彩位;
- 支持RGB、CMYK以及YCbCr等多种色彩模式,支持多平台;
-
最大位深为
32bit
; -
支持压缩和不压缩
两种类型,其中压缩支持多种压缩格式,变化较多。 -
通常TIFF文件的格式如下:最常见的排列方式为:
IFH-文件数据-IFD
组成
TIF图一般由三个部分组成:文件头(简称IFH)、文件目录(简称IFD)以及图像数据。
一个TIFF文件可以有多个IFH,但是只能有一个IFD。
下面仔细介绍一下TIFF文件。
(所有的标签都是以
升序
排列)
在检索时,可以快速利用偏置位置迅速找到数据所在位置。
图像文件头(Image File Header – IFH)
由8个字节组成,以
升序排列
,IFH 包含 3 个成员:Byteorder、version、offset to first IFD。
名称 | 字节数 | 数据类型 |
---|---|---|
Byteorder | 2 | 整型 |
Version | 2 | 整型 |
Offset | 4 | 整型 |
Byteorder
字节顺序标志位,取值为4D4D(“MM”)或4949(“II”)。MM表示大字节在前,小字节在后,II表示小字节在前,大字节在后。
Version
TIFF标志位,值固定为 2A00(42)。
可用于检验tiff文件
Offest to first IFD
偏置,
第一个
IFD
相对于文件起始位置
的偏移量(由于偏置必须以 Word 边界开始,因此值必须为2的整数倍)。
注意:IFH后不一定紧接着就是IFD,通常有的时候会先有多个IFH,才会有IFD。
图像文件目录(Image File Directory – IFD)
和IFH一样,IFD同样包含三个元素:Directory Entry Count、Directory Entry以及Offset to next IFD。IFD用于标识一个图像的
所有属性
,具有图片属性也称为图片标签。
- 一个 TIFF 文件可以包含多个 IFD,一个 IFD 标识一个图像的属性。
名称 | 字节数 | 数据类型 |
---|---|---|
Directory Entry Count | 2 | 整型 |
Directory Entry | n*12 | 整型 |
Offset to next IFD | 4 | Long |
Directory Entry Count
DE(Directory Entry )个数,表示此IFD中包含多少个DE。假设此IFD具有n个DE。
Directory Entry
DE,每个DE标识图像的一个属性,图像具有n个属性则具有n个DE,一个DE占用12个字节,因此n个DE总共占用(n*12)个字节。
Offset to next IFD
距离下一个IFD相对于
文件开始
的偏移量。例如,如果一个TIF文件中只包含一张图片,则只有一个IFD,偏移量等于0。
DE(图像属性)的详细说明
一个 DE 记录一个图像的属性,例如图像的分辨率、是否进行压缩等。其存储结构如下所示:
名称 | 字节数 | 数据类型 |
---|---|---|
Tag | 2 | 整型 |
Type | 2 | 整型 |
Length | 4 | Long |
Offset | 4 | Long |
-
Tag:属性的标签编号,按
升序
排列。 - Type:属性的数据类型
-
Length:该类型的数据
个数
(数量) -
Offest:
(有时没有offset)
是TagID代表的变量值相对文件开始处的偏移量,如果实际数据的字节数小于等于 4,则不需要设置偏移量,直接存储数据。
Type类型:Rational:由两个Long组成,第一个位分数,第二个位偏移地址
其中Tag属性根据一下表中数据判断:
TagID | 属性名称 | type | 说明 |
---|---|---|---|
0100 | 图像宽 | int | (分辨率单位) |
0101 | 图像高 | int | (分辨率单位) |
0102 | 颜色深度 | int | 1为单色,4为16色,8为256色;如果该类型数据个数>2个,说明是真彩图像 |
0103 | 图像数据是否压缩 | int | 05表示压缩 |
0106 | 图像是否采用反色显示 | int | 01表示反色,否则表示不反色 |
011A | 水平分辩率偏移量 | Rational | 常用计量单位是:像素/英寸 |
011B | 垂直分辩率偏移量 | Rational | 常用计量单位是:像素/英寸 |
0132 | 生成该图像的时间 | ASCII | 文本类型(7位ASCII码加1位二进制0) |
0140 | 调色板偏移量 | int | 256色和16色图像才有此属性;而且有连续2个 |
1、Rational指分数类型,由两个Long组成,第1个是分子,第2个是分母
2、ASCII码:文本类型
2、在Adobe官网我找到了TIFF详细的DE定义,附在参考文献中,供大家查询。
图像数据
TIFF支持多种数据存储格式(包括压缩未压缩、像素位存储或颜色面存储等),根据IFD中的设置进分析。TIFF支持的数据压缩类型可能比任何其他的图像文件格式都多。因此TIFF具有一个弊端,由于其压缩方式的多样性,许多有效的TIFF文件可能只能由个别程序进行识别。
(不过实际中图像经常采用LZW压缩)
在不缓冲整个文件的情况下,TIFF文件的流式传输在所有情况下都是不可能的。
目前Adobe享有TIFF规范版权,用于TIFF格式的管理和维护。Adobe可以创建带有单层图层的TIFF文件,同时还可以选择使用图像金字塔保存TIFF。
实例详解
注意:在读写字节流时由于TIFF为小字节在前,要从右向左读。
PS:CSDN上上传不了tiff格式的图片,利用wechat截图给大家举一个例子;将tiff格式的图片利用Visual Studio 2019二进制编辑器打开。
最终获得的二进制码如下:
逐次进行验证:
1、IFH部分:
名称 | 长度 | 实例 | 数据说明 |
---|---|---|---|
字节顺序 | 2 | 49 49 | 从小字节在前 |
TIFF标志位 | 2 | 00 2A | TIFF固定值 |
偏置 | 4 | 8 | 第一个IFD的偏移量 |
图像数据 | … | … | … |
(此图只有一张图片,故有且只有一个IFD)
-
对偏移量做一点说明:偏移量08
(指向第1行,第8列)
2、IFD部分:
由IFH中偏移量得出:08为IFD开始处,有0x14,也就是十进制中20个DE(图片属性),每个DE占12个字节,20个DE共占240字节;
对DE进行分析:
图中用不同颜色标记处不同的DE,从最开始深蓝色标注处的DEcount起,00FE为一个DE的名称…以此类推。
序号 | Tag | Type | Length | Value/Offset | 说明 |
---|---|---|---|---|---|
1 | FE 00 | long | 1 | 0 | 新子文件类型(New SubfileType) |
2 | 01 00 | int | 1 | 303 | 图片宽度:303(分辨率单位) |
3 | 01 01 | int | 1 | 300 | 图片长度:300(分辨率单位) |
4 | 01 02 | int | 3 | 012c.H(偏移地址) | 3个int型,分别用3bit表示,此为24位真彩图 |
5 | 01 03 | int | 1 | 1 | 图片未经过压缩 |
6 | 01 06 | int | 1 | 2 | 图像为RGB图像,未反色(0表示黑,最大值表示白) |
7 | 01 11 | long | 1 | 4C6A.H(偏移地址) |
Strip Offset :每个条状数据在文件中的偏移量 |
8 | 01 12 | int | 1 | 1 | 第0行表示图像的可视顶部,第0列表示可视左侧(图像无隐藏部分) |
9 | 01 15 | int | 1 | 3 | RGB三通道 |
10 | 01 16 | int | 1 | 012C.H(偏移地址) |
RowsPerStrip 每个条带内图像的行数 |
11 | 01 17 | long | 1 | 04293C.H(偏移地址) |
StripByteCount 当采用某种压缩方式后,每个条带内包含的字节数 |
12 | 01 1A | Rational | 1 | 0104.H(偏移地址) | 宽度方向上每分辨率单位包含的像素个数 |
13 | 01 1B | Rational | 1 | 010C.H(偏移地址) | 长度方向上每分辨率单位包含的像素个数 |
14 | 01 1C | int | 1 | 1 | 每个像素的采样值连续存储,只有一个图像平面 |
15 | 01 28 | int | 1 | 2 | 分辨率单位(inch英尺) |
16 | 01 31 | ASCII | 31 | 0114.H(偏移地址) | 用于创建映像的软件包的名称和版本号 |
17 | 01 32 | ASCII | 20 | 0134.H(偏移地址) | DateTime 图片创造的时间 |
18 | 02 BC | byte | 20 | 148.H(偏移地址) | 未知 |
19 | 49 86 | byte | 5,382 | 156.H(偏移地址) | 未知 |
20 | 69 87 | long | 1 | 475A8.H(偏移地址) | 未知 |
总结
1、值得一提的是,在建立TIFF图片文件时,我最开始使用画板创建的tiff图片太宽,宽高太夸张,于是我就用PS对图片进行截取,最终获得了合适的图片。再利用PS进行图片保存过程时,选择储存图片方式位tiff会弹出这种提示窗,用户可以选择压缩或者不压缩两种格式。
这也验证了TIFF图片存储具有多种方法,支持压缩也支持不压缩。
2、TIFF的DE标签存储的内容很大,最开始练习读TIFF16进制数据的时候不太习惯,有的时候很容易找不到DE标签的位置。
参考资料:
1、DE标签官方解释:https://www.awaresystems.be/imaging/tiff/specification/TIFF6.pdf
2、TIFF文件格式详解:http://blog.sina.com.cn/s/blog_668aae7801017gr9.html
3、tiff标签简单使用说明:http://t.csdn.cn/or5X6