TIFF数据格式实例分析

2024-05-15 18:48

本文主要是介绍TIFF数据格式实例分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初步概念参考: https://www.cnblogs.com/gywei/p/3393816.html
素材下载:https://download.csdn.net/download/u010476739/11485520
官方格式文档说明: https://www.awaresystems.be/imaging/tiff/specification/TIFF6.pdf
分析时的辅助软件(AsTiffTagViewer): https://www.awaresystems.be/imaging/tiff/astifftagviewer/installer0200.exe

一 准备图片

1.1 打开window画图:

win+r
mspaint

1.2 将图像尺寸调整为5*2像素

1.3 最终图片为:

在这里插入图片描述

1.4 将图片另存为tif

在这里插入图片描述

1.5 检查文件二进制数据

使用editplus打开,16进制模式查看:
在这里插入图片描述

二 开始分析

2.1 图像文件头Image File Header(IFH)

  • 0-1字节:49 49 翻译到英文为:II,表示小字节在前。
  • 2-3字节:2A 00 翻译成数字为:42,一般都是42(官网文档解释:An arbitrary but carefully chosen number (42) that further identifies the file as a
    TIFF file)
    4-7字节:1C 00 00 00表示的是第一个IFD的偏移量

2.2 图像文件目录Image File Directory(IFD)

从2.1的分析中已经得知了第一个IFD的偏移量是1C,那么直接跳到这个位置阅读(中间跳过的字节先不管,后面会分析到)。

  • 1C-1D字节:0F 00 翻译到数字为:15,表示此IFD包含了15个DE,那么从1E-D1正好是15个DE(12*15=180个字节,D1-1E+1=180个字节[16进制算法])。注意:这个IFD所占的空间为(1C-D5),别忘了IFD的最后还有四个字节。
  • 从上面的分析知道了15个DE所占的字节,这里直接将这些DE的解析结果贴出来:
    在这里插入图片描述
    这里着重分析红线标红的四个DE
  • StripOffsets和StripByteCounts,这两个DE表示的是图像数据的位置,也就是说图像数据是从第8个字节开始并且长度为20.
    找到这一块数据的位置,发现正好是IFH和第一个IFD中间的部分(也是上面说的“中间跳过的字节先不管,后面会分析到”)
  • BitsPerSample:官方文档给的解释是:“Number of bits per component”,再结合“Photometric”这个DE的值来看,不难发现它们要表达的意思是这个图像使用RGB颜色表示,每个元色用1个字节(8)个比特位来表示。表达的意思知道了,那么看看它是怎么存储的,找到这个DE的前两个字节(42-43):02 01,它是DE的tag,表示的意思就是“itsPerSample”,接着看后面两个字节(44-45):03 00 它表示的是数据类型,查看官方文档的数据类型的表格说明(下图)得知它占2个字节,接着看后面四个字节(46-49):03 00 00 00 它表示的是数据的数量,翻译过来就是3个字节长度为2的数据,总共六个字节。那么这六个字节在哪呢?接着看后面的四个字节(4A-4D):D6 00 00 00 由此可知这六个字节是D6-DB,把数据读出来正好是8,8 ,8
  • XResolution与YResolution:这两个DE表示的是分辨率,分析的方法同上一个,之所以提出这两个是因为它们的数据所占的字节正好是最后的16个字节,你可以试试。

在这里插入图片描述

三 分析完毕,所有的字节都被覆盖到!

这篇关于TIFF数据格式实例分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992627

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum