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

相关文章

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

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

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比