JPEG系列二 JPEG文件中的EXIF(上)

来源:互联网 发布:上海知楚仪器股权 编辑:程序博客网 时间:2024/06/14 02:06

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 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 迷你世界联机卡怎么办 绝地求生被火瓶烧了怎么办 win8电脑太卡怎么办 win8关机没反应怎么办 arma3没子弹了怎么办 g350d柴油冻了怎么办 散热硅胶干了怎么办 电脑打不开pdf文件怎么办 文件变成快捷方式打不开怎么办 ai文件打不开了怎么办 电脑下载了病毒软件怎么办 打嗝停不下来怎么办 咳嗽停不下来怎么办 电动机停不下来怎么办 电脑所有程序都打不开怎么办 机顶盒画面卡顿怎么办 电脑画面卡顿怎么办 鞋舌头跑偏怎么办 球球大作战老卡怎么办 孩子被打却不敢还手怎么办? 自卫砍伤了人怎么办 系统还原节点黑屏了怎么办 我惹事了要被打怎么办 诛仙宠物太多怎么办 笔记本玩lolfps低怎么办 lol延迟有42怎么办 软件安装后黑屏怎么办 汽车脚垫翘边怎么办 晴季寿司会员怎么办 理财产品跑路了怎么办 宝宝足跟血异常怎么办 孩子足跟血异常怎么办 打印机显示用户干预怎么办 打印机脱机状态怎么办win10 电脑打印机显示脱机怎么办 佳能打印机显示脱机怎么办 汽车说明书丢了怎么办 oppo手机刷机后内存不足怎么办 电脑运行太慢怎么办 台式电脑卡慢怎么办 touch炫舞不记得区怎么办