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

相关文章

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring