首先是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值

1

2

3

4

5

6

格式

unsigned byte

ascii strings

unsigned short

unsigned long

unsigned rational

signed byte

单个数据字节数

1

1

2

4

8

1

type值

7

8

9

10

11

12

格式

undefined

signed short

signed long

signed rational

single float

double float

单个数据字节数

1

2

4

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

3

1

JpegImageWidth

JPEG图宽度

tiff

2

101

3

1

JpegImageLength

JPEG图高度

tiff

3

102

3

3

JpegBitsPerSample

每通道位数

tiff

4

103

3

1

Compression

压缩

tiff

5

10F

2

6

Maker

制造商

tiff

6

110

2

14

Model

相机型号

tiff

7

111

4

1

JpegStripOffsets

JPEG图偏置值

tiff

8

112

3

1

Orientation

方向

tiff

9

117

4

1

JpegStripByteConunts

JPEG图数据长度

tiff

10

11A

5

1

XResolution

X分辨率

tiff

11

11B

5

1

YResolution

Y分辨率

tiff

12

128

3

1

ResolutionUnit

分辨率单位

tiff

13

132

2

20

DateTime

修改时刻

tiff

14

8769

4

1

ExifOffset

exif信息IFD的偏置量

exif entries

exif

1

829A

5

1

ExposureTime

曝光时间

exif

2

829D

5

1

FNumber

光圈

exif

3

8822

3

1

ExposureProgram

曝光程序

exif

4

8827

3

1

ISOSpeedRatings

ISO值

exif

5

9000

7

4

ExifVersion

exif版本

exif

6

9003

2

14

DateTimeOriginal

拍摄时刻

exif

7

9004

2

14

DateTimeDigitized

数字化时刻

exif

8

9101

7

4

ComponentsConfiguration

exif

9

9201

A

1

ShutterSpeedValue

比1秒快的级数

exif

10

9202

5

1

ApertureValue

比F1小的级数

exif

11

9204

A

1

ExposureBiasValue

补偿级数

exif

12

9207

3

1

MeteringMode

测光模式

exif

13

9209

3

1

Flash

闪光灯运行

exif

14

920A

5

1

FocalLength

镜头焦距

exif

15

927C

7

20A8

MakerNoteOffset

makernote信息IFD的偏置量

makernote entries

make

1

1

3

46

CameraSettings1

相机设置1

make

2

2

3

4

CanonFocalLength

焦距

make

3

3

3

4

make

4

4

3

34

CameraSettings2

相机设置2

make

5

6

2

32

Image Type

图片类型

make

6

7

2

32

Firmware Version

硬件版本

make

7

9

2

32

Owner Name

拥有者

make

8

C

4

1

Camera Serial Number

序列号,为4字节整数值

make

9

D

7

1024

make

10

F

3

19

Custom Functions

用户设置

make

11

10

4

1

make

12

12

3

28

CanonPictureInfo

图像信息

make

13

13

3

4

make

14

15

4

1

make

15

19

3

1

make

16

83

4

1

make

17

93

3

16

CanonFileInfo

文件信息

make

18

A0

3

14

CanonColorInfo

色彩信息

make

19

AA

3

5

make

20

D0

4

1

make

21

E0

3

17

make

22

4001

3

582

make

23

4002

3

2676

make

24

4003

3

22

exif

16

9286

7

108

UserComment

用户备注

exif

17

A000

7

4

FlashPixVersion

flashpix版本

exif

18

A001

3

1

ColorSpace

色彩空间

exif

19

A002

3

1

ExifImageWidth

主图像宽度

exif

20

A003

3

1

ExifImageHeight

主图像高度

exif

21

A005

4

1

ExifInteroperabilityOffset

指向IFD。描述互通性

exif

22

A20E

5

1

FocalPlaneXResolution

像面分辨率

exif

23

A20F

5

1

FocalPlaneYResolution

像面分辨率

exif

24

A210

3

1

FocalPlaneResolutionUnit

像面分辨率单位

exif

25

A401

3

1

CustomRendered

渲染方式?

exif

26

A402

3

1

ExposureMode

曝光模式

exif

27

A403

3

1

WhiteBalance

白平衡设置

exif

28

A406

3

1

SceneCaptureType

图像类型?

ifd

=

offset=

entries=

tiff

1

201

4

1

JpegIFOffset

JPEG缩略图偏置量

tiff

2

202

4

1

JpegIFByteCount

JPEG缩略图数据长度

ifd

=

offset=

entries=

tiff

1

100

3

1

RGBImageWidth

RGB缩略图宽度

tiff

2

101

3

1

RGBImageLength

RGB缩略图高度

tiff

3

102

3

3

RGBBitsPerSample

每通道位数

tiff

4

103

3

1

Compression

压缩(无效?)

tiff

5

106

3

1

PhotometricInterpretation

色彩空间

tiff

6

111

4

1

RGBStripOffsets

RGB缩略图偏置值

tiff

7

115

3

1

RGBSamplesPerPixel

每像素通道数

tiff

8

116

3

1

RGBRowsPerStrip

数据块中的行数

tiff

9

117

4

1

RGBStripByteConunts

RGB缩略图数据长度

tiff

10

11C

3

1

PlanarConfiguration

如果是YCRCB,排列方式

tiff

11

C5D9

4

1

ifd

=

offset=

entries=

tiff

1

103

3

1

Compression

压缩(无效?)

tiff

2

111

4

1

StripOffsets

RAW图偏置值

tiff

3

117

4

1

StripByteConunts

RAW图数据长度

tiff

4

C5D8

4

1

tiff

5

C5E0

4

1

makernotes的部分内容是整型数组,按照在数组中的位置解析:

名称

数组中的位置

含义

CameraSettings1

1

Length in bytes

2

Macro mode

3

Self-timer in 1/10 second

4

Quality

5

Flash Mode

6

Continuous drive mode

7

8

Focus Mode

9

10

11

Image Size

12

Easy shooting Mode

13

Digital Zoom

14

Contrast

15

Saturation

16

Sharpness

17

ISO Speed

18

Metering Mode

19

Focus Type

20

Auto Focus Point Selected

21

Exposure Mode

22

23

LensType

24

long focal length of lens

25

short focal length of lens

26

focal units per mm

27

28

29

Flash Activity

30

Flash details

31

32

33

FocusContinuous

34

35

36

37

ZoomedResolution

38

ZoomedResolutionBase

39

40

41

42

43

ColorTone

44

45

46

Custom Functions

1

Length in Byte

2

SetFunctionWhenShooting

3

LongExposureNoiseReduction

4

FlashSyncSpeedAv

5

Shutter-AELock

6

AFAssistBeam

7

ExposureLevelIncrements

8

FlashFiring

9

ISOExpansion

10

AEBSequence

11

SuperimposedDisplay

12

MenuButtonDisplayPosition

13

MirrorLockup

14

AFPointSelectionMethod

15

ETTLII

16

ShutterCurtainSync

17

SafetyShiftInAVorTV

18

LensAFStopButton

19

AddOriginalDecisionData

CanonFocalLength

2

FocalLength

3

FocalPlaneXSize in 1/1000 inch

4

FocalPlaneYSize in 1/1000 inch

CanonPictureInfo

3

CanonImageWidth

4

CanonImageHeight

5

CanonImageWidthAsShot

6

CanonImageHeightAsShot

23

AFPointsUsed

CanonFileInfo

1

Length in Byte

2

Directory

3

filenumber

CanonColorInfo

1

Length in Byte

10

ColorTemperature

CameraSettings2

1

Length in Byte

2

3

ISO

4

5

TargetAperture

6

TargetExposureTime

7

ExposureCompensation

8

WhiteBalance

9

10

SequenceNumber

11

12

13

14

15

16

FlashExposureComp

17

AutoExposureBracketing

18

AEBBracketValue

19

20

FocusDistanceUpper

21

FocusDistanceLower

22

FNumber

23

ExposureTime

24

25

Bulb Duration in 1/10 second

26

27

28

AutoRotate

29

30

Self-timer2

31

32

33

34

因为CR2是私有格式,有些tag的含义还没有搞清楚。

有趣的是在CR2中除了主图数据外,还含有3个缩略图,其中一个是大幅的JPEG图,另外2个是小幅的JPEG和位图。通过读取IFD可以找到它们在文件中的位置和数据长度,直接将对应的数据块保存下来就是标准的图像文件。

从RAW图像偏置值出发可以解码原始图像数据。

通过读DCRAW源程序学到了许多东西。终于搞明白了CR2的结构。

下面的一些术语可能用得不甚准确,只是用来描述编程的思路。

从RAW图像偏置值可以定位到RAW图像数据块的起始点。

以下双字节整型高位字节在前,低位字节在后。

第一个是整数0xFFDA。

接下来的信息块类似IFD,包含多个组,每个数据块组结构是:

第一个2字节的整数为tag,表示是哪种信息;

第二个2字节的整数为len,表示以字节为单位的数据长度,包括本整数。接下来是len字节长的数据。

tag(hex) len 说明

FFC3

4

2个双字节整数,第一个是存储图像高度,第二个是存储图像的宽度的一半

FFC4

60

解码表

FFDA

-

CCD压缩数据的开始

解码表是60个单字节的数组,1-30字节为奇数列(1,3,5……)的解码表,31-60字节是偶数列(2,4,6……)的解码表。

30字节的编解码表结构:

1:0用于奇数列,1用于偶数列。

2-17:按照顺序分别代表从1到16位码字的数量,其和为13,即共有13种码字。

18-30:每种码字后面对应的数据比特数。

码字的确定:

定义'最大码字'。(最大码字并非真正的码字)

设:‘0'位数的最大码字是0。

如果某个位数的最大码字是N,则下一个位数的最大码字为2*N+M,M是下一个位数的码字的数量。

下一个位数的码字从2*N开始依次增加,直到2*N+M-1。数量M分别由编码表中2-17字节对应的数值确定。

解码树:

按照以上编码表构造出2个二叉解码树。

解码树可以用链表来实现。对每一个码字,从根节点出发,测试每一位对应的节点,如果不存在,则创建节点。最后一位对应的节点存储数据比特数。

解压缩:

从FFDA开始是真正的CCD数据,按行的顺序排列,采用变长压缩形式,注意每个0xFF后面的一个字节被忽略。

每个像元的数据格式是码字+数据。由码字确定数据的长度,即比特数,进而读出数值。如果此数的最高位是0,则表示是负值,需要取补码。

例如,假设码字010对应的比特数是7,则以下比特列 0100010100100…… 解码过程是:

1)读010,解析出数据长度7比特

2)读7个比特:0010100 |b=20

3)最高位是0,实际数值是 20-1111111|b=-107

这样读出的每个像元位置上的数值还不是原始数据,而是经过了变换。恢复的步骤是:

1)第1行第1、2个数值分别加2048

2)第1、2列从第2行起,依次每个像元的值加上上一行同列像元的值

3)从第3列起,依次每个像元的值加上左边第2列同行像元的值

这样就获得了CCD的原始感光数据。20D的CFA排列方式是:

RGRGRGRG
GBGBGBGB

由此加上色彩均衡,即得到彩色图像。

Canon CR2图片格式分析相关推荐

  1. NOKIA、MOTOROLA、SIMENS及ERICCSON铃声和图片格式分析(转)

    NOKIA.MOTOROLA.SIMENS及ERICCSON铃声和图片格式分析 最近一直有些朋友们要求总结一下主流手机铃声和图片的问题,由于本人在这方面基本没有什么尝试,只能将有些朋友们发表过的东西总 ...

  2. BMP图片格式分析(超详细)

    文章目录 前言 一.BMP格式概览 二.实战分析bmp图片数据 前言 对学习C++感兴趣的可以看看这篇文章哦:C/C++教程 BMP图片大家见的应该也比较多,它是一种非常基本的图片格式 因为最近对C+ ...

  3. PNG图片格式分析格式

    PNG文件格式 PNG总体格式 一个PNG文件是由8字节的文件标志和按照特定结构组织的3个以上的数据块(chunk)构成的,结构如所示.具体结构如图1.图2所示 PNG文件结构 图1  包含调色板数据 ...

  4. Tga图片格式分析以及程序实现

    继位图之后,我们来看看Tga图片的格式,以及程序实现. 一.  文件格式 Tga常见的格式有非压缩RGB和压缩RGB两种格式,其他格式的我们在这里不做讲述.文件的第三个Byte位作为标记:2为非压缩R ...

  5. 几种常见图片格式优缺点分析

    有损vs无损 图片文件格式有可能会对图片的文件大小进行不同程度的压缩,图片的压缩分为有损压缩和无损压缩两种. 有损压缩.指在压缩文件大小的过程中,损失了一部分图片的信息,也即降低了图片的质量,并且这种 ...

  6. 使用macOS自带convert,sips命令快速处理图片及转换图片格式

    写在前面 最近有需求转换图片的格式, 例如 将.PDF转换为.png以便CSDN编辑器上传(如果直接使用截图会显得比较麻烦,多费一道手续), 或是将微信的一些图片制作成表情包(需要转换图片为.gif格 ...

  7. 通过文件头标识判断图片格式

    通过文件头标识判断图片格式 用Delphi从内存流中通过文件头标识判断图片格式 文件头标识大全: http://www.garykessler.net/library/file_sigs.html h ...

  8. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表混淆 | resources.arsc 资源映射表二进制格式分析 | 混淆全局字符串池和资源名称字符串池 )

    文章目录 一.resources.arsc 资源映射表 混淆 二.resources.arsc 资源映射表二进制格式分析 三.参考资料 资源混淆时 , 需要修改混淆 resources.arsc 资源 ...

  9. 文件头标识判断图片格式

    同图片的文件头标志: 图片的格式很多,一个图片文件的后缀名并不能说明这个图片的真正格式什么,那么如何获取图片的格式呢?我想到了几个简单但有效的方法,那就是读取图片文件的文件头标识.我们知道各种格式的图 ...

最新文章

  1. C#中使用DirectX编程
  2. 多处理与线程Python
  3. 查询所有的存储过程哪些中包含某个字符串
  4. TaskIcon 系统任务栏图标
  5. OPC的数据访问方法分别有同步访问、异步访问和订阅式
  6. 【C++ grammar】对象和类(创建对象、对象拷贝、分离声明与实现)
  7. LeetCode-652. 寻找重复的子树
  8. mysql6.1 交叉编译_Armbian系统-mysql-connector-c++-1.1.8版本-交叉编译-安装
  9. java spring security详解
  10. vue结合elementUI,MinUi
  11. 父亲节华为P40软文营销广告
  12. 贝壳找房的2021,依然充满变数
  13. 快速构建电脑软件系统 、超好用经典的网页推荐汇总
  14. 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m0)个叶子结点,那么该二叉树上的结点总数为( )。
  15. 自适应滤波(LMS,RLS)
  16. OpenCV图像色温
  17. 代码随想录训练营day27
  18. 蓝桥杯单片机第四届省赛题详细讲解(模拟智能灌溉系统)
  19. 人人都能懂的量子力学
  20. 单片机之震动传感器、继电器、433M无线发射接收等模块介绍及应用

热门文章

  1. 华为Android10版怎么截屏,华为Mate 10怎么截屏 三种智能截屏方式图文教程
  2. 字节Java高工面试:java时间戳是毫秒还是秒
  3. python -m是什么意思
  4. 【不入流】C语言,冒泡排序
  5. “为地球熄灯一小时”纯属闹剧
  6. oracle scur,python3 连接 sql oracle mysql的方法 Python3连接SQLServer、Oracle、MySql的方法...
  7. k-阶特征交叉增强图卷积网络
  8. word 读取 java_Java word 内容读取
  9. SPT20 协议_夫妻财产分割协议书范本包括哪些内容?
  10. ps安装包、教程、素材