首先是 8 个字节的文件头。
CR2 的前 2 个字节是"II",代表 INTEL 格式的存储顺序,即低字节在前,高字节
在后。
接下来是固定的 2 个字节:0x2a00。
最后的 4 个字节的整数是指向第一个 IFD(IMAGE FILE DIRECTORY)的绝对偏置
量(起始位置)。
IFD 的结构如下:
第一个 2 字节的整数表示在此 IFD 内的 entry 的数量,每个 entry 为 12 字节,
顺序排列。最后一个 entry 之后的 4 字节整数代表下一个 IFD 的起始位置,如果
是 0,表示这是最后一个 IFD。
ENTRY 的结构如下:
第一个 2 字节的整数为 tag,表示是哪种信息;
第二个 2 字节的整数为 type,表示单个数据的格式,对应的数据类型如表:
type
值
格式
单个数
据字节
数
type
值
格式 undefined
signed
short
单个数
据字节
数
1
1
2
3
4
5
6
unsigned
byte
ascii
strings
unsigned
short
unsigned
long
unsigned
rational
signed
byte
1
7
1
8
2
signed
long
2
9
4
4
10
8
1
11
12
signed
rational
single
float
double
float
8
4
8
第三个 4 字节的整数为 len,表示数据的个数;
由 type 值可以确定单个数据占用的字节数,乘以 len 就是数据的总长度。如果
数据总长不超过 4 个字节,则保存在 entry 最后的 4 个字节中;如果超过 4 个字
节,则 entry 最后的 4 字节整数代表数据的存储位置相对文件头的偏置量。在该
位置上可以读取数据。 根据这样的规则,就可以从 raw 文件中确定里面所含的
每个 IFD 内的每个 tag 值,及按照 type 和 len 信息确定数据位置并读取。接下
来是一个查表解读的过程。
在 IFD 中对应 tag 0x8769 的 4 位整数是指向另一个含有 EXIF 信息的子 IFD 的偏
置量。
EXIF 子 IFD 的结构与 IFD 相同,只是只有一个。
在 EXIF 子 IFD 中对应 tag 0927c 的 4 位整数是指向另一个含有 MAKERNOTE 信息
的子 IFD 的偏置量。该子 IFD 的结构与 IFD 相同,也只有一个。
按照以上规则从 CR2 文件中顺序读出的内容为:
(HEX) TYPE LEN 名称
含义
编
号
类别
order=
val=
ifd=
offset
entries
tiff
1 100
tiff
2 101
tiff
3 102
tiff
tiff
tiff
4 103
5 10F
6 110
tiff
7 111
tiff
8 112
tiff
9 117
tiff
tiff
10 11A
11 11B
tiff
12 128
tiff
13 132
3
3
3
3
2
2
4
3
4
5
5
3
2
1
1
3
1
6
JpegImageWidth
JpegImageLength
JpegBitsPerSample
Compression
Maker
14
Model
1
1
1
1
1
1
JpegStripOffsets
Orientation
JpegStripByteConunts
XResolution
YResolution
ResolutionUnit
20
DateTime
tiff
14 8769 4
1
ExifOffset
JPEG 图宽
度
JPEG 图高
度
每通道位
数
压缩
制造商
相机型号
JPEG 图偏
置值
方向
JPEG 图数
据长度
X 分辨率
Y 分辨率
分辨率单
位
修改时刻
exif 信息
IFD 的偏
exif
entries
exif
exif
exif
exif
exif
exif
1 829A 5
2 829D 5
3 8822 3
4 8827 3
5 9000 7
6 9003 2
exif
7 9004 2
exif
8 9101 7
exif
9 9201 A
exif
10 9202 5
exif
exif
11 9204 A
12 9207 3
exif
13 9209 3
exif
14 920A 5
1
1
1
1
4
14
14
4
1
1
1
1
1
1
exif
15 927C 7
20A8 MakerNoteOffset
makernote
entries
make
make
make
make
make
make
make
1 1
2 2
3 3
4 4
5 6
6 7
7 9
make
8 C
make
9 D
3
3
3
3
2
2
2
4
7
46
CameraSettings1
4
4
34
32
32
32
CanonFocalLength
CameraSettings2
Image Type
Firmware Version
Owner Name
1
Camera Serial Number
1024
ExposureTime
FNumber
ExposureProgram
ISOSpeedRatings
ExifVersion
DateTimeOriginal
DateTimeDigitized
置量
曝光时间
光圈
曝光程序
ISO 值
exif 版本
拍摄时刻
数字化时
刻
ComponentsConfiguration ?
ShutterSpeedValue
ApertureValue
ExposureBiasValue
MeteringMode
Flash
FocalLength
比 1 秒快
的级数
比 F1 小的
级数
补偿级数
测光模式
闪光灯运
行
镜头焦距
makernote
信息 IFD
的偏置量
相机设置
1
焦距
相机设置
2
图片类型
硬件版本
拥有者
序列号,为
4 字节整
数值
Custom Functions
用户设置
CanonPictureInfo
图像信息
CanonFileInfo
CanonColorInfo
文件信息
色彩信息
10 F
11 10
12 12
13 13
14 15
15 19
16 83
17 93
18 A0
19 AA
20 D0
21 E0
3
4
3
3
4
3
4
3
3
3
4
3
22 4001 3
19
1
28
4
1
1
1
16
14
5
1
17
582
make
make
make
make
make
make
make
make
make
make
make
make
make
make
make
exif
23 4002 3
2676
24 4003 3
22
16 9286 7
108 UserComment
exif
17 A000 7
exif
18 A001 3
exif
19 A002 3
exif
20 A003 3
exif
21 A005 4
exif
22 A20E 5
exif
23 A20F 5
exif
24 A210 3
exif
25 A401 3
exif
26 A402 3
exif
27 A403 3
exif
28 A406 3
4
1
1
1
1
1
1
1
1
1
1
1
FlashPixVersion
ColorSpace
ExifImageWidth
ExifImageHeight
ExifInteroperabilityOffset
FocalPlaneXResolution
FocalPlaneYResolution
FocalPlaneResolutionUnit
CustomRendered
ExposureMode
WhiteBalance
SceneCaptureType
用户备注
flashpix
版本
色彩空间
主图像宽
度
主图像高
度
指向 IFD。
描述互通
性
像面分辨
率
像面分辨
率
像面分辨
率单位
渲染方
式?
曝光模式
白平衡设
置
图像类
型?
ifd
=
offset=
entries=
tiff
1 201
4
tiff
2 202
4
ifd
=
offset=
entries=
tiff
1 100
tiff
2 101
tiff
3 102
tiff
4 103
tiff
5 106
tiff
6 111
tiff
7 115
tiff
8 116
3
3
3
3
3
4
3
3
tiff
9 117
4
tiff
10 11C
3
tiff
ifd
11 C5D9 4
=
offset=
entries=
tiff
1 103
tiff
2 111
3
4
1
1
1
1
3
1
1
1
1
1
1
1
1
1
1
JpegIFOffset
JpegIFByteCount
RGBImageWidth
RGBImageLength
RGBBitsPerSample
Compression
JPEG 缩略
图偏置量
JPEG 缩略
图数据长
度
RGB 缩略
图宽度
RGB 缩略
图高度
每通道位
数
压缩(无
效?)
PhotometricInterpretation 色彩空间
RGBStripOffsets
RGBSamplesPerPixel
RGBRowsPerStrip
RGBStripByteConunts
PlanarConfiguration
Compression
StripOffsets
RGB 缩略
图偏置值
每像素通
道数
数据块中
的行数
RGB 缩略
图数据长
度
如果是
YCRCB,排
列方式
压缩(无
效?)
RAW 图偏
置值
tiff
3 117
4
tiff
tiff
4 C5D8 4
5 C5E0 4
1
1
1
StripByteConunts
RAW 图数
据长度
makernotes 的部分内容是整型数组,按照在数组中的位置解析:
名称
数组中的位置 含义
CameraSettings1 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Length in bytes
Macro mode
Self-timer in 1/10 second
Quality
Flash Mode
Continuous drive mode
Focus Mode
Image Size
Easy shooting Mode
Digital Zoom
Contrast
Saturation
Sharpness
ISO Speed
Metering Mode
Focus Type
Auto Focus Point Selected
Exposure Mode
LensType
long focal length of lens
short focal length of lens
focal units per mm
Flash Activity
Flash details
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
FocusContinuous
ZoomedResolution
ZoomedResolutionBase
ColorTone
Custom Functions 1
Length in Byte
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SetFunctionWhenShooting
LongExposureNoiseReduction
FlashSyncSpeedAv
Shutter-AELock
AFAssistBeam
ExposureLevelIncrements
FlashFiring
ISOExpansion
AEBSequence
SuperimposedDisplay
MenuButtonDisplayPosition
MirrorLockup
AFPointSelectionMethod
ETTLII
ShutterCurtainSync
SafetyShiftInAVorTV
LensAFStopButton
AddOriginalDecisionData
CanonFocalLength 2
FocalLength
3
FocalPlaneXSize in 1/1000
4
CanonPictureInfo 3
4
5
6
23
1
2
3
1
10
CanonFileInfo
CanonColorInfo
CameraSettings2 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
inch
FocalPlaneYSize in 1/1000
inch
CanonImageWidth
CanonImageHeight
CanonImageWidthAsShot
CanonImageHeightAsShot
AFPointsUsed
Length in Byte
Directory
filenumber
Length in Byte
ColorTemperature
Length in Byte
ISO
TargetAperture
TargetExposureTime
ExposureCompensation
WhiteBalance
SequenceNumber
FlashExposureComp
AutoExposureBracketing
AEBBracketValue
FocusDistanceUpper
FocusDistanceLower
FNumber
ExposureTime