数据压缩第二周作业

  • 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格式分析相关推荐

  1. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  2. 软件质量与测试--第二周作业 WordCount

    软件质量与测试--第二周作业 WordCount Github地址: https://github.com/RicardoDZX/WordCount PSP: PSP2.1 PSP 阶段 预估耗时 ( ...

  3. 20189221 2018-2019-2 《密码与安全新技术专题》第二周作业

    20189221 2018-2019-2 <密码与安全新技术专题>第二周作业 课程:<密码与安全新技术专题> 班级: 201892 姓名: 郭开世 学号:20189221 上课 ...

  4. 20189200余超 2018-2019-2 移动平台应用开发实践第二周作业

    2018-2019-2 移动平台应用开发实践第二周作业 实验部分,在linux中用git命令将代码传到码云上 成功上传的截图 码云上的截图 遇到如下的问题 解决方法 我发现在进行第一步git clon ...

  5. 【中文】【吴恩达课后编程作业】Course 4 - 卷积神经网络 - 第二周作业

    [中文][吴恩达课后编程作业]Course 4 - 卷积神经网络 - 第二周作业 - Keras入门与残差网络的搭建 上一篇:[课程4 - 第二周测验]※※※※※ [回到目录]※※※※※下一篇:[课程 ...

  6. 厚基础Linux——第二周作业

    文章目录 厚基础Linux--第二周作业 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. SlackWare SUSE DeBian Ubuntu RedHat RedHat Lin ...

  7. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第二周作业 - 词向量的运算与Emoji生成器

    [中文][吴恩达课后编程作业]Course 5 - 序列模型 - 第二周作业 - 词向量的运算与Emoji生成器 上一篇:[课程5 - 第二周测验]※※※※※ [回到目录]※※※※※下一篇:[课程5 ...

  8. 2019年春季学期第二周作业(文件指针)

    2019年春季学期第二周作业(基础作业) 请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始).并将最大值和对应的最小下标数值写入文件. 输入: 请建立以自 ...

  9. 软件工程 第二周作业

    ##软件工程第二周作业 提出问题 1. 一般来说,想要自己的程序跑得又快又好,就要减少函数的反复调用,但有所得则必有所失,效能提高就有可能伴随着程序的稳定性的降低,这两者应该如何权衡呢? 2. 关于5 ...

最新文章

  1. 查找手机型号云服务器,查找手机型号云服务器
  2. python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
  3. 跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试
  4. android tag的作用,Android中的Context的作用(2)
  5. html页面根据分辨率缩放,html2Canvas根据不同分辨率,生成pdf内容自适应
  6. CharSequence类
  7. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正
  8. 斗地主AI算法——第二章の数据结构
  9. 三星Galaxy Note 10顶配版现身:陶瓷材质+12GB内存
  10. CHIL-SQL-INNER JOIN 关键字
  11. SpringCloudAlibaba-Nacos 介绍、单机模式下搭建及基本使用
  12. 反编译获取任何微信小程序源码——看这篇就够了
  13. Python词云图的几种制作方法
  14. mac虚拟机改显存_虚拟机mac怎么增大显存
  15. 码农都该知道的开发工具
  16. 普通用户申请微软的OneDrive免费网盘,容量5T、5T、5T,重要事情说三遍!!!!!
  17. Go实战--golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等
  18. 神经元的结构模型图片,神经元模型图片解析
  19. Quartz任务调度器详解
  20. Android 屏幕刷新机制 VSync+Choreographer

热门文章

  1. 2013年度中国优秀开源项目
  2. HTML之body标签中的相关标签
  3. 【报告分享】 2020年快手手机行业数据价值报告-磁力数观(附下载)
  4. 不同封装0Ω电阻通流能力
  5. matlab h面分贝方向图,天线技术实验报告
  6. 2021年低压电工实操考试视频及低压电工考试试题
  7. 杰理AC692X---添加串口打印调试
  8. 如何自学维修计算机,怎样快速学习汽车电脑维修?从入门到精通
  9. js 元旦倒计时【非常nice】
  10. linux 剪刀石头布c语言,C语言实现最简单的剪刀石头布小游戏示例