刚刚结束本科生活的我,那会还比较颓废,但是因为读研,导致宝宝七月初就到了学校,来了以后也不知道该做什么,就出去浪呀~哈哈,不料来了不久后接到老师的任务,让宝宝把JPEG图像的EXIF信息解读出来,当时内心OS大抵是:什么?老师说了什么?当时对于EXIF完全陌生,没有一点概念,宝宝在百度之后,也是比较蒙圈的,不过还是拖拖拉拉的去整理了一下,能百度到的相关资料比较有限,但还是参考了好多大神的博文,灰常有用,但是有些解读数据的部分介绍的很简单,对于初次尝试解读信息的我们来说摸不着头脑,布吉岛怎么出来的,我自己尝试过后,大体都解读出来了,有些问题还没有完全弄明白是为什么(加了底纹颜色,请多指教),只是摸到了规律,but还是先贴出来遛遛。。。。。。
恩~EXIF信息到底是什么就不介绍了,既然要做这个自然是已经百度过了,有相关概念的,而如何查看JPEG图像的EXIF信息,这个嘛,我自己是下载了一个WinHEX,很方便哦。顺便安利一个MagicEXIF编辑器,可以清楚地看到你的JPEG图像所包含的所有信息。既然能查看EXIF信息了,那如何将一串串的HEX形式的信息和了解到的文字性质的属性对应起来呢?下面我们就开始解读咯~
FF D8:SOI(Start of image)标记
FF E1:APP1标记
APP1数据
35 89:APP1数据大小
45786966 0000:Exif头
49492A00 08000000:TIFF 头,4949表示按照 "Intel" 的字节序(Little Endian) 来排列数据,2A00表示两个字节长度,08000000表示到第一个IFD的偏移量为8
0E 00:目录项的号码=14
项目0
0E 01:代表标签号,对应的标签名为 ImageDescription
02 00:数据值为2,代表数据格式为ascii strings
1B 00 00 00:组件的数目=27(27个字节)
F4 03 00 00:数据的偏移量 (地址03F4)
红框开始的位置为起始地址,偏移12个字节,黄框之内的内容为数据内容,共27个字节(00表示空格)。相关验证如下图:
项目1
0F 01:代表标签号,对应的标签名为 Make
02 00:数据值为2,代表数据格式为ascii string
1E 00 00 00:组件的数目=30(30个字节)
0F 04 00 00:数据的偏移量(地址040F)
红框位置为起始地址,偏移12个字节,黄框之内的为数据内容(30个字节,‘00’代表空格),验证如下图:
项目2
10 01:代表标签号,对应的标签名为 Model
02 00:数据值为2,代表数据格式为 ascii string
1E 00 00 00:组件的数目=30(30个字节)
2D 04 00 00:数据的偏移量(地址042D)
红框位置为起始位置,偏移12字节,黄框之内为数据内容(30个字节,‘00’表示空格),验证如下图:
项目3
12 01:代表标签号,对应的标签名为 Orientation
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件的数目=1(2个字节)
01 00 00 00:数据值=1 ,见下图(value=1,上/左)
项目4
1A 01:代表标签号,对应的标签名为XResolution
05 00:数据值为5,代表数据格式为 unsigned rational
01 00 00 00:组件的数目=1(8个字节)
4B 04 00 00:数据的偏移量(地址044B)
红框位置为起始地址,偏移12字节,黄框内为数据内容(8个字节),十六进制(48 00 00 00)=十进制(72),十六进制(01 00 00 00)=十进制(1),XResolution=72/1。
项目5
1B 01:代表标签号,对应的标签名为YResolution
05 00:数据值为5,代表数据格式为 unsigned rational
01 00 00 00:组件的数目=1(8个字节)
53 04 00 00:数据的偏移量(地址0453)
红框位置为起始地址,偏移12字节,黄框内为数据内容(8个字节),十六进制(48 00 00 00)=十进制(72),十六进制(01 00 00 00)=十进制(1),XResolution=72/1。
项目6
28 01:代表标签号,对应的标签名为ResolutionUnit
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
02 00 00 00:数据值=2(英寸),见下图。
项目7
31 01:代表标签号,对应的标签名为Software
02 00:数据值为2,代表数据格式为ascii string
18 00 00 00:组件的数目=24(24个字节)
5B 04 00 00:数据的偏移量(地址04 5B)
红框位置为起始地址,偏移12字节,黄框内为数据内容(24个字节),验证如下图:
项目8
32 01:代表标签号,对应的标签名为DateTime
02 00:数据值为2,代表数据格式为 ascii string
14 00 00 00:组件数目=20(20个字节)
73 04 00 00:数据的偏移量(地址0473)
红框位置为起始地址,偏移12字节,黄框内为数据内容(20个字节),验证如下图:
项目9
13 02:代表标签号,对应的标签名为YCbCrPositioning
03 00:数据值为3,代表数据格式为 unsigned rational
01 00 00 00:组件数目=1(2个字节)
01 00 00 00:数据值=1,见下图,‘1’表示像素阵列的中心
项目10
69 87:代表标签号,对应的标签名为ExifOffset
04 00:数据值为4,代表数据格式为 unsigned long
01 00 00 00:组件数目=1(4个字节)
B6 00 00 00:数据值=182,Exif子IFD的偏移量
项目11
25 88:代表标签号,对应的标签名为GPSInfo (Misc Tags)
04 00:数据值为4,代表数据格式为 unsigned long
01 00 00 00:组件数目=1(4个字节)
AE 02 00 00:数据值=686(GPS目录偏移量)
项目12
9C 9C:代表标签号,对应的标签名为 备注
01 00:数据值为1,代表数据格式为 unsigned byte
00 01 00 00:组件数目=256(256个字节)
87 04 00 00:数据的偏移量(地址0487)
红框位置为起始地址,偏移12字节,黄框内为数据内容(256个字节),验证如下图:
项目13
9E 9C:代表标签号,对应的标签名为 关键词
01 00:数据值为1,代表数据格式为 unsigned byte
00 01 00 00:组件数目=256(256个字节)
87 05 00 00:数据的偏移量(地址0587)
红框位置为起始地址,偏移12字节,黄框内为数据内容(256个字节),验证如下图:
拍摄参数(子IFD)
08 03 00 00:
27 00:十六进制(27)=十进制(39),目录号的数目=39
项目0
9A 82:代表标签号,对应的标签名为Exposure Time
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
87 06 00 00:数据偏移量(地址0687),有理数翻转?如下图所示:
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(000007D0)=2000,后四位作为分母,H(000F4240)=1000000,最终结果:2000/1000000=1/500(缺省单位)。
项目1
9D 82:代表标签号,对应的标签名为FNumber
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件的数目=1(8个字节)
8F 06 00 00:数据的偏移量(地址068F)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(00000230)=560,后四位作为分母,H(00000064)=100,最终结果=560/100=5.6
项目2
22 88:代表标签号,对应的标签名为ExposureProgram
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件的数目=1(2个字节)
02 00 00 00:数据值=2,‘2’表示正常程序曝光
项目3
27 88:代表标签号,对应的标签名为ISOSpeedRatings
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件的数目=1(2个字节)
64 00 00 00:数据值=100,十六进制(64)=十进制(100)
项目4
00 90:代表标签号,对应的标签名为ExifVersion
07 00:数据值为7,代表数据格式为undefined
04 00 00 00:组件数目=4(4个字节)
30 32 33 30:数据值=0230,表明Exif版本是2.3的,相关解释如下图:
项目5
03 09:代表标签号,对应的标签名为DateTimeOriginal
02 00:数据值为2,代表数据格式为ascii strings
14 00 00 00:组件数目=20(20个字节)
97 06 00 00:数据的偏移量(地址0697)
红框位置为起始地址,偏移12字节,黄框内为数据内容(20个字节),验证如下图:
项目6
04 90:代表标签号,对应的标签名为DateTimeDigitized
02 00:数据值为2,代表数据格式为ascii strings
14 00 00 00:组件数目=20(20个字节)
AB 06 00 00:数据的偏移量(地址06AB)
红框位置为起始地址,偏移12字节,黄框内为数据内容(20个字节),验证如下图:
项目7
01 91:代表标签号,对应的标签名为ComponentsConfiguration
07 00:数据值为7,代表数据格式为undefined
04 00 00 00:组件数目=4(4个字节)
00 03 02 01:数据值,01,02,03,见下图:
项目8
02 91:代表标签号,对应的标签名为CompressedBitsPerPixel
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
BF 06 00 00:数据的偏移量(地址06BF)
红框位置为起始地址,偏移12字节,黄框内为数据内容(8个字节),验证如下:
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(0083ADE2)=8629730,后四位作为分母,H(00261300)=2495232,最终结果=8329730/2495232=3.458488
项目9
01 92:代表标签号,对应的标签名为ShutterSpeedValue(JPEG (粗略的估计)的平均压缩率)
0A 00:数据值为10,代表数据格式为signed rational
01 00 00 00:组件数目=1(8个字节)
C7 06 00 00:数据的偏移量(地址06C7)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(FFFFDCFB)=4294958331,后四位作为分母,H(FFFFFC18)=4294966296,最终结果为10.8????? 此处结果有疑问
项目10
02 92:代表标签号,对应的标签名为ApertureValue
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
CF 06 00 00:数据的偏移量(地址06CF)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(000001F1)=497,后四位作为分母,H(00000064)=100,最终结果=497/100=4.97
项目11
04 92:代表标签号,对应的标签名为ExposureBiasValue
0A 00:数据值为10,代表数据格式为signed rational
01 00 00 00:组件数目=1(8个字节)
D7 06 00 00:数据的偏移量(地址06D7)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(00000000)=0,后四位作为分母,H(00000020)=32,最终结果=0/32=0
项目12
05 92:代表标签号,对应的标签名为MaxApertureValue
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
DF 06 00 00:数据的偏移量(地址06DF)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(00000129)=297,后四位作为分母,H(00000064)=100,最终结果=297/100=2.97
项目13
06 92:代表标签号,对应的标签名为SubjectDistance
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
E7 06 00 00:数据的偏移量(地址06E7)
十六进制(00000000)=十进制(0),十六进制(00000064)=十进制(100)。
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,最终结果=0/100=0。
项目14
07 92:代表标签号,对应的标签名为MeteringMode
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
02 00 00 00:数据值=2,‘2’为中央重点测光
项目15
08 92:代表标签号,对应的标签名为LightSource
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,‘0’意味着未知。
项目16
09 92:代表标签号,对应的标签名为Flash
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
20 00 00 00:数据值=32
项目17
0A 92:代表标签号,对应的标签名为FocalLength
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
EF 06 00 00:数据的偏移量(地址06EF)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,H(00000370)=880,后四位作为分母,H(00000064)=100,最终结果=880/100=8.8
项目18
7C 92:代表标签号,对应的标签名为MakerNote
07 00:数据值为7,代表数据格式为 undefined
00 04 00 00:组件数目=1024(1024个字节)
F7 06 00 00:数据偏移量(地址06F7)
项目19
00 A0:代表标签号,对应的标签名为FlashPixVersion
07 00:数据值为7,代表数据格式为 undefined
04 00 00 00:组件数目=4(4个字节)
30 30 31 30:数据值=0100,H(30313030)=string(0100), 如果图像数据是基于 FlashPix formar Ver.1.0, 则这个值为 "0100".
项目20
01 A0:代表标签号,对应的标签名为ColorSpace
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
01 00 00 00:数据值=1,‘1’表示图像使用sRGB色彩空间
项目21
02 A0:代表标签号,对应的标签名为ExifImageWidth
04 00:数据值为4,代表数据格式为 unsigned long
01 00 00 00:组件数目=1(4个字节)
60 15 00 00:数据值=5472,十六进制(00001560)=十进制(5472)。
项目22
03 A0:代表标签号,对应的标签名为ExifImageHeight
04 00:数据值为4,代表数据格式为 unsigned long
01 00 00 00:组件数目=1(4个字节)
40 0E 00 00:数据值=3648,十六进制(00000E40)=十进制(3648)。
项目23
05 A0:代表标签号,对应的标签名为ExifInteroperabilityOffset
04 00:数据值为4,代表数据格式为 unsigned long
01 00 00 00:组件数目=1(4个字节)
90 02 00 00:数据值=656,十六进制(00000290)=十进制(656)。
项目24
15 A2:代表标签号,对应的标签名为ExposureIndex
05 00:数据值为5,代表数据格式为 unsigned rational
01 00 00 00:组件数目=1(8个字节)
F7 0A 00 00:数据偏移量(地址0AF7)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,最终结果=0
项目25
00 A3:代表标签号,对应的标签名为FileSource
07 00:数据值为7,代表数据格式为 undefined
01 00 00 00:组件数目=1(1个字节)
03 00 00 00:数据值=3,值 '0x03' 表示图像源是数字定格相机。
项目26
01 A3:代表标签号,对应的标签名为SceneType
07 00:数据值为7,代表数据格式为 undefined
01 00 00 00:组件数目=1(1个字节)
01 00 00 00:数据值=1,值 '0x01' 表示图像是通过相机直接拍摄出来的。
项目27
01 A4:代表标签号,对应的标签名为CustomRendered
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像未启用自定义处理。
项目28
02 A4:代表标签号,对应的标签名为ExposureMode
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像曝光模式为:自动曝光
项目29
03 A4:代表标签号,对应的标签名为WhiteBalance
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像白平衡为:自动白平衡
项目30
04 A4:代表标签号,对应的标签名为DigitalZoomRatio
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
FF 0A 00 00:数据偏移量(地址0AFF)
Rational为有理数类型,计算结果用分子分母表示,同时,将黄框内数据按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,最终结果=0
项目31
05 A4:代表标签号,对应的标签名为FocalLengthIn35mmFilm
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
18 00 00 00:数据值=24
项目32
06 A4:代表标签号,对应的标签名为SceneCaptureType
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像场景拍摄类型为:标准
项目33
07 A4:代表标签号,对应的标签名为GainControl
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像没有增益控制
项目34
08 A4:代表标签号,对应的标签名为Contrast
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像对比度“正常”
项目35
09 A4:代表标签号,对应的标签名为Saturation
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像饱和度“正常”
项目36
0A A4:代表标签号,对应的标签名为Sharpness
03 00:数据值为3,代表数据格式为 unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像锐度“正常”
项目37
0C A4:代表标签号,对应的标签名为SubjectDistanceRange
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
00 00 00 00:数据值=0,值 '0x00' 表示图像主体距离范围“未知”
项目38
31 A4:代表标签号,对应的标签名为BodySerialNumber
02 00:数据值为2,代表数据格式为 ascii strings
30 00 00 00:组件数目=48(48个字节)
07 0B 00 00:数据偏移量(地址0B07)
红框位置为起始地址,偏移12个字节,黄框之内的为数据内容(48个字节,‘00’代表空格),验证如下图:
可交换信息
蓝框内数据可划分为两部分,前四个字节为第一部分,后两个字节为第二部分:
00 00 00 00:
02 00:目录项的数目=2
(注意:此部分的数据值为正向读值,原因????)
项目0
01 00:代表标签号,对应的标签名为InteroperabilityIndex
02 00:数据值为2,代表数据格式为 ascii string
04 00 00 00:组件数目=4(4个字节)
52 39 38 00:H(52393800)=ascii string(R98)
项目1
02 00:代表标签号,对应的标签名为InteroperabilityVersion
07 00:数据值为7,代表数据格式为Undefined
04 00 00 00:组件数目=4(4个字节)
30 31 30 30:H(30313030)=0100
GPS信息
蓝框内数据可划分为两部分,前四个字节为第一部分,后两个字节为第二部分:
00 00 00 00:
07 00:目录项数目=7
(注意:此部分的数据值为正向读值,原因????)
项目0
00 00:代表标签号,对应的标签名为GPSVersionID
01 00:数据值为1,代表数据格式为unsigned byte
04 00 00 00:组件数目=4(4个字节)
02 03 00 00:H(02)=2,H(03)=3,表示GPS版本为Ver.2.3
项目1
01 00:代表标签号,对应的标签名为GPSLatitudeRef
02 00:数据值为2,代表数据格式为ascii strings
02 00 00 00:组件数目=2(2个字节)
4E 00 30 73:H(4E003073)=ascii strings(N0s)
项目2
02 00:代表标签号,对应的标签名为GPSLatitude
05 00:数据值为5,代表数据格式为unsigned rational
03 00 00 00:组件数目=3(24个字节)
37 0B 00 00:字节数大于4个字节,该处数据代表数据的偏移量,地址为0B37
红框起始位置为地址的起始位置,红框内12个字节为偏移量,黄框内为数据内容。
Rational为有理数类型,计算结果用分子分母表示,将黄框内数据(24个字节)按每八个字节为一组,分为三个部分,对于每一部分按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,计算过程如下:
H(00 00 00 18)=24,H(00 00 00 01)=1,度=24/1=24;
H(00 00 00 18)=24,H(00 00 00 01)=1,分=24/1=24;
H(00 03 DC 32)=252978,H(00 00 27 10)=10000,秒=252978/10000=25.2978;
最终结果=24度24分25.2978秒
项目3
03 00:代表标签号,对应的标签名为GPSLongitudeRef
02 00:数据值为2,代表数据格式为ascii strings
02 00 00 00:组件数目=2(2个字节)
45 00 30 73:H(45003073)=ascii strings(E0s)
项目4
04 00:代表标签号,对应的标签名为GPSLongitude
05 00:数据值为5,代表数据格式为unsigned rational
03 00 00 00:组件数目=3(24个字节)
4F 0B 00 00:字节数大于4个字节,该处数据代表数据的偏移量,地址为0B4F
红框起始位置为地址的起始位置,红框内12个字节为偏移量,黄框内为数据内容。
Rational为有理数类型,计算结果用分子分母表示,将黄框内数据(24个字节)按每八个字节为一组,分为三个部分,对于每一部分按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,计算过程如下:
H(00 00 00 76)=118,H(00 00 00 01)=1,度=118/1=118;
H(00 00 00 00)=0,H(00 00 00 01)=1,分=0/1=0;
H(00 08 F9 96)=588182,H(00 00 27 10)=10000,秒=588182/10000=58.8182;
最终结果=118度0分58.8182秒
项目5
05 00:代表标签号,对应的标签名为GPSAltitudeRef
01 00:数据值为1,代表数据格式为unsigned byte
01 00 00 00:组件数目=1(1个字节)
00 00 00 00:数据值=0,值‘0X00’表示图像的高度参考为海平面
项目6
06 00:代表标签号,对应的标签名为GPSAltitude
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
67 0B 00 00:字节数大于4个字节,该处数据代表数据的偏移量,地址为(0B67)
红框起始位置为地址的起始位置,红框内12个字节为偏移量,黄框内为数据内容。
Rational为有理数类型,计算结果用分子分母表示,将黄框内数据(8个字节)按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,计算过程如下:
H(00 02 85 70)=165232,H(00 00 03 E8)=1000;
最终结果=165232/1000=165.232
缩略图信息(IFD1)
蓝框内数据可划分为两部分,前四个字节为第一部分,后两个字节为第二部分:
00 00 00 00:
06 00:目录项数目=6
项目0
03 01:代表标签号,对应的标签名为Compression
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
06 00 00 00:字节数小于4个字节,该处数据代表数据值,且数据值=6,即JPEG压缩格
项目1
1A 01:代表标签号,对应的标签名为XResolution
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
6F 0B 00 00:字节数大于4个字节,该处数据代表数据的偏移量,地址为(0B6F)
红框起始位置为地址的起始位置,红框内12个字节为偏移量,黄框内为数据内容。
Rational为有理数类型,计算结果用分子分母表示,将黄框内数据(8个字节)按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,计算过程如下:
H(00 00 00 48)=72,H(00 00 00 01)=1;
最终结果=72/1=72
项目2
1B 01:代表标签号,对应的标签名为YResolution
05 00:数据值为5,代表数据格式为unsigned rational
01 00 00 00:组件数目=1(8个字节)
77 0B 00 00:字节数大于4个字节,该处数据代表数据的偏移量,地址为(0B77)
红框起始位置为地址的起始位置,红框内12个字节为偏移量,黄框内为数据内容。
Rational为有理数类型,计算结果用分子分母表示,将黄框内数据(8个字节)按每四个字节进行翻转计算,前四位作为分子,后四位作为分母,计算过程如下:
H(00 00 00 48)=72,H(00 00 00 01)=1;
最终结果=72/1=72
项目3
28 01:代表标签号,对应的标签名为ResolutionUnit
03 00:数据值为3,代表数据格式为unsigned short
01 00 00 00:组件数目=1(2个字节)
02 00 00 00:字节数小于4个字节,该处数据代表数据值,数据值=2,即表示“厘米”
项目4
01 02:代表标签号,对应的标签名为JpegIFOffset
04 00:数据值为4,代表数据格式为unsigned long
01 00 00 00:组件数目=1(4个字节)
F4 0B 00 00:字节数等于4个字节,该处数据代表数据值,H(00 00 0B F4)=3060,表示到JPEG数据的偏移量为3060
项目5
02 02:代表标签号,对应的标签名为JpegIFByteCount
04 00:数据值为4,代表数据格式为unsigned long
01 00 00 00:组件数目=1(4个字节)
8D 29 00 00:字节数等于4个字节,该处数据代表数据值,H(00 00 29 8D)=10637,表示JPEG的数据大小为10637
DQT段
FF D8:文件头
FF :段标记
DB:段类型,DB代表定义量化表
00 84:段长度,H(84)=132字节,0C04-0C87
00:QT号=0,QT精度=8bit
SOF段
FF:段标记
C0:段类型,C0代表帧开始
00 11:段长度,H(11)=17字节,0C8A-0C9A
08:样本精度=8bit
00 78 00 A0:图像高=120,图像宽=160
03:组件数量=3,YCbCr彩色图
01:ID号=1,这是亮度Y组件
21:化为二进制=00010101,表明垂直采样系数=2,水平采样系数=1
00:使用QT号=0的量化表
02:ID号=2,这是色度的Cb组件
11:化为二进制=00010001,表明垂直和水平采样系数均=1
01:使用QT号=1的量化表
03:ID号=3,这是色度Cr组件
11:化为二进制=00010001,表明垂直和水平采样系数均=1
01:使用QT号=1的量化表
DHT段
FF:段标记
C4:段类型,C4代表定义霍夫曼表
01 A2:段长度,H(01 A2)=418字节,0C9D-0E3E
00:HT号=0,DC表
SOS段
FF: 段标记
DA: 段类型,DA代表扫描行开始
00 0C: 段长度=12字节
03: 组件数量=3
01 00:组件ID=1,Y组件,使用HT表号=0的AC表
02 11:组件ID=2,Cb组件,使用HT表号=1的DC表
03 11:组件ID=3,Cr组件,使用HT表号=1的DC表
00 3F 00:几乎每个JPG文件中这3个字节的值都相同,但用途不明
0E4D-358A:图像压缩数据
358B-358C:FF D9,文件尾
姿态信息部分:
FF E1:APP1
1F FE:H(1FFE)=8190字节,358F-558C为8190字节
http://ns.adobe.com/xap/1.0/<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="DJI Meta Data" xmlns:tiff="http://ns.adobe.com/tiff/1.0/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:crs="http://ns.adobe.com/camera-raw-settings/1.0/" xmlns:drone-dji="http://www.dji.com/drone-dji/1.0/" xmp:ModifyDate="2017-04-07" xmp:CreateDate="2017-04-07" tiff:Make="DJI" tiff:Model="FC6310" dc:format="image/jpg" drone-dji:AbsoluteAltitude="+165.23" drone-dji:RelativeAltitude="+149.10" drone-dji:GimbalRollDegree="+0.00" drone-dji:GimbalYawDegree="-4.60" drone-dji:GimbalPitchDegree="-40.00" drone-dji:FlightRollDegree="-0.80" drone-dji:FlightYawDegree="-1.10" drone-dji:FlightPitchDegree="+6.60" drone-dji:CamReverse="0" drone-dji:GimbalReverse="0" crs:Version="7.0" crs:HasSettings="False" crs:HasCrop="False" crs:AlreadyApplied="False"> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="w"?>//末尾
① xmlns(XML Namespaces的缩写)是一个属性,是XML(标准通用标记语言的子集)命名空间。作用是赋予命名空间一个唯一的名称。
② Rdf:资源描述框架(Resource Description Framework),一种用于描述Web资源的标记语言。RDF是一个处理元数据的XML(标准通用标记语言的子集)应用,所谓元数据,就是“描述数据的数据”或者“描述信息的信息”。
需要的姿态数据位于FF E1部分,其中
红色部分:38AF——38D0:drone-dji:GimbalRollDegree=”+0.00”
绿色部分:38D5——38F5:drone-dji:GimbalYawlDegree=”-4.60”
蓝色部分:38FA——391D:drone-dji:GimbalPitchDegree=”-40.00”
相关的数据内容如下图: