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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如