JPEG图片中的EXIF信息遵循TIFF格式标准,因此EXIF分为上下两篇。

上篇介绍一下TIFF文件格式,下篇介绍EXIF在JPEG中的作用和存储的信息。
TIFF文件格式简介
TIFF - Tag Image File Format文件格式最早是为了存储扫描仪图像而设计的。它的最大的特点就是与计算机的结构、操作系统以及图形硬件系统无关。它可处理黑白、灰度、彩色图像。在存储真彩色图像时和BMP格式一样,直接存储RGB三原色的浓度值而不使用彩色映射(调色板)。对于介质之间的交换,TIF称得上是位图格式的最佳选择之一。
TIFF的全面性也产生了不少问题,它的包罗万象造成结构较为复杂,变体很多,兼容性较差,它需要大量的编程工作来全面译码。例如,TIF图像数据可以用几种不同的方法压缩,用一个程序来读出所有的TIF几乎是不可能的。
TIFF文件格式结构
TIFF图一般由三个部分组成:文件头(简称IFH)、文件目录(简称IFD)、图像数据。TIF图像文件的一般组织形式是:IFH——图像数据——IFD。
IFD数据结构并不一定紧跟在IFH后面,相反,它常常位于图像数据的后面。
1、图像文件头(Image File Header简称IFH)
 
           IFH结构描述(图1)
IFH数据结构包含3个成员共计8个字节:
名称
字节数
数据类型
说明
Byte order
2
Integer
TIF标记,其值为“MM”(0x4d4d)或“II”(0x4949)

0x4d4d表示该TIFF图是Motoral整数格式,即BigEndian;
0x4949表示该图是Intel整数格式,即LittleEndian。
Version
2
Integer
版本号,其值恒为0x2A 00
Offset to first IFD
4
Long
第一个IFD相对文件开始处的偏移量(可能会有多个顺序排列的IFD)
2、图像文件目录(Image File Directory简称IFD)

         IFD及DE结构描述(图2)
IFD结构
IFD是TIFF图像文件中重要的数据结构,它包含了三个成员:DE count、DE、next IFD offset。
由于一个TIFF文件中可以有多个图像,而一个IFD只标识一个图像的所有属性(或称之为“标签”),所以,一个TIFF文件中有几个图像,就会有几个IFD。
IFD的结构:
名称
字节数
数据类型
说明
Directory Entry Count
2
Integer
该IFD中DE的数量
Directory Entry(1)
12
Integer
DE,“目录项”
Directory Entry(2) 
12
Integer
DE的个数是不定的,因为每个DE只标识了图像的一个属性,那么这幅图像有N个属性就会有N个DE;
……
 
 
用户甚至可添加自定义的标记属性,这就是为什么称TIF格式文件为“可扩充标记的文件”的原因。
Directory Entry(N)
12
Integer
 
Offset to next IFD 
4
Long
下一个IFD相对于文件开始处的位置,这是一个链式结构。

如果该数字为0,表示已经是最后一个IFD。
如果该TIF文件只包含了一幅图像,那么就只有一个IFD,这个偏移量也会等于0。
DE目录入口(Directory Entry)
一个DE就是一幅图像的某一个属性。例如图像的大小、分辨率、是否压缩、像素的行列数、颜色深度(单色、16色、256色、真彩色)等等。
DE结构:
名称
字节数
数据类型
说明
tag
2
Integer
本属性的标签编号。在图像文件目录中,它是按照升序排列的(但不一定是连续的)
type
2
Integer
本属性值的数据类型
length
4
Long
该类型数据的个数
valueOffset
4
Long
属性值的存放偏移量。

tagID代表的变量值相对文件开始处的偏移量,但如果变量值占用的空间不多于4个字节(例如只有1个Integer类型的值),那么该值就直接存放在valueOffset中,没必要再另外指向一个地方了。
DE中标签编号的含义
TagID
属性名称
type
说明
0100
图像宽
Integer
 
0101
图像高
Integer
 
0102
颜色深度
Integer
1为单色,4为16色,8为256色。

如果该类型数据个数>2个,说明是真彩图像
0103
图像数据是否压缩
Integer
压缩方式(1/2/5/6/32773),1为不压缩,其他表示压缩
0106
图像是否采用反色显示
Integer
01表示反色,否则表示不反色

对于RGB图,该值是2
0111
图像扫描线偏移量
Long
图像数据起始字节相对于文件开始处的位置
0116
图像扫描线的数量
Long
表示图像有几行扫描线,实际上等于图像高度
0117
图像数据字节总数
Integer
一般是个偶数。如果是奇数,那么实际存放时会在后面补一个0,但这个0不会计算在字节总数之内。
011A
水平分辩率偏移量
RATIONAL
单位:像素/英寸

分数型的属性,其值要占用8个字节,所以在valueOffset中存放的肯定是它的具体数值的偏移量,而不是数值本身。下同。
011B
垂直分辩率偏移量
RATIONAL
单位:像素/英寸
011C
像素存储顺序
Integer
每个像素的(R,G,B)是如何存储的。1表示按照RGBRGB的顺序来存储
0128
X/Y分辨率单位
Integer
X/Y轴分辨率的单位
0131
生成该图像的软件名
ASCII
字符型属性。值所占用的空间也会大于4字节,所以在valueOffset中存放的也是它们的值的偏移量,而不是值本身。下同。
0132 
生成该图像的时间
ASCII
 
0140
调色板偏移量
Integer
256色和16色图像才有此属性,而且有连续2个调色板,但属性的length值只表示出1个调色板
在TIFF6.0中,定义了12种数据类型,分别是:
1 = BYTE 8-bit unsigned integer.

2 = ASCII 8-bit byte that contains a 7-bit ASCII code; the last byte must be NUL (binary zero).
3 = SHORT 16-bit (2-byte) unsigned integer.
4 = LONG 32-bit (4-byte) unsigned integer.
5 = RATIONAL Two LONGs: the first represents the numerator of a fraction, the second the denominator.
6 = SBYTE An 8-bit signed (twos-complement) integer.
7 = UNDEFINED An 8-bit byte that may contain anything, depending on the definition of the field.
8 = SSHORT A 16-bit (2-byte) signed (twos-complement) integer.
9 = SLONG A 32-bit (4-byte) signed (twos-complement) integer.
10 = SRATIONAL Two SLONGs: the first represents the numerator of a fraction, the second the denominator.
11 = FLOAT Single precision (4-byte) IEEE format.
12 = DOUBLE Double precision (8-byte) IEEE format.
3、TIFF中的图像数据
图像数据。这些数据可能是压缩的,也可能是未压缩的。如果经过压缩,那么压缩算法又有许多种,所以,图像数据是TIF文件中最为复杂的部分,暂还没有哪个软件能译出所有的压缩算法。
TIFF实例
用画图程序新建一个17*15的白色图像,另存为TIF文件:
0000: 49 49 2A 00 4E 00 00 00 80 3F E0 50 38 24 16 0D
0010: 07 84 42 61 50 B8 64 36 1D 0F 88 44 62 51 38 A4
0020: 56 2D 17 8C 46 63 51 B8 E4 76 3D 1F 90 48 64 52
0030: 39 24 96 4D 18 80 80 00 60 00 00 00 01 00 00 00
0040: 60 00 00 00 01 00 00 00 08 00 08 00 08 00  0F 00
0050: FE 00 04 00 01 00 00 00 00 00 00 00 00 01 03 00
0060: 01 00 00 00 11 00 00 00 01 01 03 00 01 00 00 00
0070: 0F 00 00 00 02 01 03 00 03 00 00 00 48 00 00 00
0080: 03 01 03 00 01 00 00 00 05 00 00 00 06 01 03 00
0090: 01 00 00 00 02 00 00 00 11 01 04 00 01 00 00 00
00A0: 08 00 00 00 15 01 03 00 01 00 00 00 03 00 00 00
00B0: 16 01 04 00 01 00 00 00 0F 00 00 00 17 01 04 00
00C0: 01 00 00 00 2F 00 00 00 1A 01 05 00 01 00 00 00
00D0: 38 00 00 00 1B 01 05 00 01 00 00 00 40 00 00 00
00E0: 1C 01 03 00 01 00 00 00 01 00 00 00 28 01 03 00
00F0: 01 00 00 00 02 00 00 00 3D 01 03 00 01 00 00 00
0100: 01 00 00 00 00 00 00 00
简要分析(注意转换16进制数据时,低位在前,高位在后):
0000-0007:49 49 2A 00 4E 00 00 00
文件头,0x49 49表示该图是Intel整数格式;0x2A 00表示TIFF版本号;0x4E表示第一个IFD的偏移量为4E。
004E-0107:第一个IFD。
Directory Entry Count的值0x0F为15,表示这个IFD中有15个DE。
每个DE占用12字节,15个DE共占用180字节,加上Directory Entry Count占用的2字节,再加上Offset to next IFD占用的4字节,这个IFD共占用186字节,换算为16进制就是BA,所以,它的数据结束于0x4E + 0xBA = 0107。
Offset to next IFD的值(最后4个字节)均为0,表示整幅图像文件只有这一个IFD。
其中15个DE的描述:
序号
偏移量
TagID
Type
length
Value/Offset
说明
1
0050
00FE
Long
1
00
未知属性值=0
2
005C
0100
Integer
1
11
图像宽为17像素(10进制)
3
0068
0101
Integer
1
0F
图像高为15像素(10进制)
4
0074
0102
Integer
3
48
3个Integer类型的值,共计6字节

所以Value/Offset中存放的是其值的偏移量。
其值存放在48-4D
5
0080
0103
Integer
1
05
图像是压缩数据,压缩类型为5
6
008C
0106
Integer
1
02
图像不反色显示
7
0098
0111
Long
1
08
图像数据起始字节为8
8
00A4
0115
Integer
1
03
未知属性值=3
9
00B0
0116
Long
1
0F
图像扫描线有15行
10
00BC
0117
Long
1
2F
图像共有47个字节的压缩数据
11
00C8
011A
RATIONAL
1
38
水平分辩率存放在38-3F
12
00D4
011B
RATIONAL
1
40
垂直分辩率存放在40-47
13
00E0
011C
Integer
1
01
像素存储顺序, 1为RGB
14
00EC
0128
Integer
1
02
Xresolution和Yresolution的单位,值为2
15
00F8
013D
Integer
1
01
未知属性值=1
0008-0037:图像数据。
注意最后那个0是补加的,它没有统计在“图像数据字节总数”属性值中。

0038-003F:60 00 00 00 01 00 00 00
水平分辩率值,8个字节。
由于它是分数类型,前4个字节是分子,其值为0x60 00 00 00,转换为10进制就是96,后4个字节是分母,其值是0x01 00 00 00,转换为10进制就是1。所以,分数值是96/1,它表示每英寸96像素
0040-0047:60 00 00 00 01 00 00 00
垂直分辩率值。同样为96像素。

0048-004D:08 00 08 00 08 00
颜色深度值。3个整型数据值都为8,表示这是一幅24位图像。
TIFF格式参考
http://www.pediy.com/kssd/pediy12/109316.html
http://bbs.pfan.cn/post/309477.html 

JPEG系列二 JPEG文件中的EXIF(上)相关推荐

  1. JPEG系列二 JPEG文件中的EXIF(下)

    https://blog.csdn.net/shelldon/article/details/54407534 EXIF格式介绍(下) JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF ...

  2. JPEG系列二 JPEG文件中的EXIF(下)

    EXIF格式介绍(下) JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF格式的介绍,可以参考上篇. 下篇中将介绍EXIF中都保存了哪些数据,这些数据的内容和格式,最后介绍一下EXIF中 ...

  3. Linux学习系列二:Linux中的常用命令

    这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...

  4. CompactExifLib:访问JPEG文件中的EXIF标签

    目录 介绍 背景 演示应用程序 使用代码 读写标签 标签ID和图像文件目录(IFD) 标签类型 整数 数组标签 字符串 有理数 日期和时间 原始数据和字节顺序 移除标签 加载和保存EXIF数据 GPS ...

  5. JPEG文件中的EXIF(下)

    原文链接 EXIF格式介绍(下) JPEG图片中的EXIF信息是以TIFF格式保存的,关于TIFF格式的介绍,可以参考上篇. 下篇中将介绍EXIF中都保存了哪些数据,这些数据的内容和格式,最后介绍一下 ...

  6. JPEG系列三 JPEG图像压缩

    转载自 www.thecodeway.com http://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/ JPEG压缩算法之前已有很多前辈详细讲解过,我 ...

  7. JPEG系列一 JPEG图片的文件格式

    JPEG图片的文件格式 互联网上广泛使用的image/jpeg 图片,准确来说,全称应该叫做使用 JPEG标准压缩图像,使用JFIF标准封装图像数据的图形文件. JPEG 是一个压缩标准,JFIF 是 ...

  8. JPEG系列一 JPEG图片的文件格式

    https://blog.csdn.net/shelldon/article/details/54144406 JPEG图片的文件格式 互联网上广泛使用的image/jpeg 图片,准确来说,全称应该 ...

  9. 标签系列二:spring 中bean解释以及bean标签里面的属性

    一.bean标签: 英文解释:Defines a single (usually named) bean. A bean definition may contain nested tags for ...

最新文章

  1. GridView标题行换行之我见 (转)
  2. ajax回调函数的返回值,使用ajax和回调函数向函数传递/返回值
  3. 2021-03-04 Halcon初学者知识 【18】谈谈秩滤波(Rank filter)
  4. Java8 EnumSet 源码简单分析
  5. 基于Linux的SOCKET编程之TCP半双工Client-Server聊天程序
  6. 工作166:错误的处理方式
  7. CSS开发过程中的20个快速提升技巧
  8. 各纬度气候分布图_世界气候类型分布图高清版(世界气候分布高清地图)V1.0 免费版...
  9. linux能yum装mcafee吗,Ubuntu安装Mcafee步骤
  10. 华为freebuds4i降噪方法分享(教程分享)
  11. 南京大学计算机考研难度分析,2020考研难度高的院校分析之【南京大学】
  12. 斯坦福大学校工程学院计算机,加州大学洛杉矶分校:受大脑启发的计算机视觉的对象发现和检测...
  13. html5限制拖拽区域怎么实现,html5怎么实现拖拽
  14. 我的世界服务器java出错_看懂 游戏《Minecraft》的崩溃报告 服务端/客户端
  15. powerdesinger 批量修改表前缀
  16. tcpcopy填坑实践。
  17. ll -h和du -sh的区别
  18. EDU教育版Office365使用教程(二):桌面版Office365下载安装
  19. 【5万字】文件增量复制【OS库、Tkinter库等】
  20. 江苏省计算机应用基础统考,年江苏省普通高“专转本”统一考试计算机应用基础.doc...

热门文章

  1. Docker基础篇 - (六)Docker 网络Spring Boot微服务打包Docker镜像
  2. MySQL5.7 Attempted to use a closed or broken resource pool 处理过程
  3. 真正可以根治高度近视眼的方法(转载)
  4. 7月18日服务器维护时,2018年7月18日维护公告
  5. android智能电灯,爱克 E-Light(智能灯泡)apk
  6. Centos 7 安装 docker
  7. fliggy 十三姨
  8. Mars3D(含Cesium)数据及服务篇:单体小模型转为glTF格式
  9. java 与或非_JAVA 或与非运算符 与()、或(|)、异或(^)
  10. 李宏毅机器学习笔记第14周_生成式对抗网络(GAN)