数据压缩第二周作业——图片TIFF格式分析

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。

名称字节数数据类型
Byteorder2整型
Version2整型
Offset4整型
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 Count2整型
Directory Entryn*12整型
Offset to next IFD4Long
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 记录一个图像的属性,例如图像的分辨率、是否进行压缩等。其存储结构如下所示:

名称字节数数据类型
Tag2整型
Type2整型
Length4Long
Offset4Long
  • Tag:属性的标签编号,按升序排列。
  • Type:属性的数据类型
  • Length:该类型的数据个数(数量)
  • Offest:(有时没有offset) 是TagID代表的变量值相对文件开始处的偏移量,如果实际数据的字节数小于等于 4,则不需要设置偏移量,直接存储数据。

Type类型:Rational:由两个Long组成,第一个位分数,第二个位偏移地址

其中Tag属性根据一下表中数据判断:

TagID属性名称type说明
0100图像宽int(分辨率单位)
0101图像高int(分辨率单位)
0102颜色深度int1为单色,4为16色,8为256色;如果该类型数据个数>2个,说明是真彩图像
0103图像数据是否压缩int05表示压缩
0106图像是否采用反色显示int01表示反色,否则表示不反色
011A水平分辩率偏移量Rational常用计量单位是:像素/英寸
011B垂直分辩率偏移量Rational常用计量单位是:像素/英寸
0132生成该图像的时间ASCII文本类型(7位ASCII码加1位二进制0)
0140调色板偏移量int256色和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部分:
在这里插入图片描述

名称长度实例数据说明
字节顺序249 49从小字节在前
TIFF标志位200 2ATIFF固定值
偏置48第一个IFD的偏移量
图像数据

(此图只有一张图片,故有且只有一个IFD)

  • 对偏移量做一点说明:偏移量08 (指向第1行,第8列)

2、IFD部分:
由IFH中偏移量得出:08为IFD开始处,有0x14,也就是十进制中20个DE(图片属性),每个DE占12个字节,20个DE共占240字节;

对DE进行分析:请添加图片描述
图中用不同颜色标记处不同的DE,从最开始深蓝色标注处的DEcount起,00FE为一个DE的名称…以此类推。

序号TagTypeLengthValue/Offset说明
1FE 00long10新子文件类型(New SubfileType)
201 00int1303图片宽度:303(分辨率单位)
301 01int1300图片长度:300(分辨率单位)
401 02int3012c.H(偏移地址)3个int型,分别用3bit表示,此为24位真彩图
501 03int11图片未经过压缩
601 06int12图像为RGB图像,未反色(0表示黑,最大值表示白)
701 11long14C6A.H(偏移地址)Strip Offset:每个条状数据在文件中的偏移量
801 12int11第0行表示图像的可视顶部,第0列表示可视左侧(图像无隐藏部分)
901 15int13RGB三通道
1001 16int1012C.H(偏移地址)RowsPerStrip每个条带内图像的行数
1101 17long104293C.H(偏移地址)StripByteCount 当采用某种压缩方式后,每个条带内包含的字节数
1201 1ARational10104.H(偏移地址)宽度方向上每分辨率单位包含的像素个数
1301 1BRational1010C.H(偏移地址)长度方向上每分辨率单位包含的像素个数
1401 1Cint11每个像素的采样值连续存储,只有一个图像平面
1501 28int12分辨率单位(inch英尺)
1601 31ASCII310114.H(偏移地址)用于创建映像的软件包的名称和版本号
1701 32ASCII200134.H(偏移地址)DateTime 图片创造的时间
1802 BCbyte20148.H(偏移地址)未知
1949 86byte5,382156.H(偏移地址)未知
2069 87long1475A8.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

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB可以使用多种函数来读取tiff文件数据。其中,geotiffread函数可以直接读取tif文件并返回矩阵数据,geotiffinfo函数可以获取tif文件的详细信息,如投影系统和坐标范围。在新版本中,不再推荐使用geotiffread函数,而是推荐使用readraster函数,其用法与geotiffread函数相似。另外,还可以使用Tiff对象来读取tif文件数据,通过创建Tiff对象并设置相应的访问类型来实现。例如,使用Tiff(filename, mode)函数创建Tiff对象,其中filename是文件名,mode是文件访问类型,默认为'r'读取模式,可以修改为'w'保存模式或'a'追加模式。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [【技巧】matlab批量读取tif数据并导出](https://blog.csdn.net/weixin_43288659/article/details/121984700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [[MATLAB学习tip3]geotiff(tif/tiff文件读取、使用与保存](https://blog.csdn.net/qq_44686047/article/details/125146746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MATLAB——tiff文件数据读取,modis](https://blog.csdn.net/weixin_44083023/article/details/123410985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值