数据压缩第二周作业——图片TIFF格式分析
数据压缩第二周作业
- TIFF格式概述
- 特点
- 组成
- 图像文件头(Image File Header - IFH)
- Byteorder
- Version
- Offest to first IFD
- 图像文件目录(Image File Directory - IFD)
- Directory Entry Count
- Directory Entry
- Offset to next IFD
- DE(图像属性)的详细说明
- 图像数据
- 实例详解
- 总结
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
数据压缩第二周作业——图片TIFF格式分析相关推荐
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 软件质量与测试--第二周作业 WordCount
软件质量与测试--第二周作业 WordCount Github地址: https://github.com/RicardoDZX/WordCount PSP: PSP2.1 PSP 阶段 预估耗时 ( ...
- 20189221 2018-2019-2 《密码与安全新技术专题》第二周作业
20189221 2018-2019-2 <密码与安全新技术专题>第二周作业 课程:<密码与安全新技术专题> 班级: 201892 姓名: 郭开世 学号:20189221 上课 ...
- 20189200余超 2018-2019-2 移动平台应用开发实践第二周作业
2018-2019-2 移动平台应用开发实践第二周作业 实验部分,在linux中用git命令将代码传到码云上 成功上传的截图 码云上的截图 遇到如下的问题 解决方法 我发现在进行第一步git clon ...
- 【中文】【吴恩达课后编程作业】Course 4 - 卷积神经网络 - 第二周作业
[中文][吴恩达课后编程作业]Course 4 - 卷积神经网络 - 第二周作业 - Keras入门与残差网络的搭建 上一篇:[课程4 - 第二周测验]※※※※※ [回到目录]※※※※※下一篇:[课程 ...
- 厚基础Linux——第二周作业
文章目录 厚基础Linux--第二周作业 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. SlackWare SUSE DeBian Ubuntu RedHat RedHat Lin ...
- 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第二周作业 - 词向量的运算与Emoji生成器
[中文][吴恩达课后编程作业]Course 5 - 序列模型 - 第二周作业 - 词向量的运算与Emoji生成器 上一篇:[课程5 - 第二周测验]※※※※※ [回到目录]※※※※※下一篇:[课程5 ...
- 2019年春季学期第二周作业(文件指针)
2019年春季学期第二周作业(基础作业) 请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始).并将最大值和对应的最小下标数值写入文件. 输入: 请建立以自 ...
- 软件工程 第二周作业
##软件工程第二周作业 提出问题 1. 一般来说,想要自己的程序跑得又快又好,就要减少函数的反复调用,但有所得则必有所失,效能提高就有可能伴随着程序的稳定性的降低,这两者应该如何权衡呢? 2. 关于5 ...
最新文章
- 查找手机型号云服务器,查找手机型号云服务器
- python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
- 跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试
- android tag的作用,Android中的Context的作用(2)
- html页面根据分辨率缩放,html2Canvas根据不同分辨率,生成pdf内容自适应
- CharSequence类
- [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
- 斗地主AI算法——第二章の数据结构
- 三星Galaxy Note 10顶配版现身:陶瓷材质+12GB内存
- CHIL-SQL-INNER JOIN 关键字
- SpringCloudAlibaba-Nacos 介绍、单机模式下搭建及基本使用
- 反编译获取任何微信小程序源码——看这篇就够了
- Python词云图的几种制作方法
- mac虚拟机改显存_虚拟机mac怎么增大显存
- 码农都该知道的开发工具
- 普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!
- Go实战--golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等
- 神经元的结构模型图片,神经元模型图片解析
- Quartz任务调度器详解
- Android 屏幕刷新机制 VSync+Choreographer