当前位置:[北京同好会]>[设备]>[300D]>[CRW文件格式]

 

CANON CRW RAW文件格式

RAW采用CIFF文件格式。

首先是26个字节的文件头。

前2个字节是"II",代表INTEL格式的存储顺序,即低字节在前,高字节在后。

然后是固定的4个字节:0x0000001a。表示主数据块(HEAP)的绝对位置(26)。

接下来是8个字节的字符串:“HEAPCCDR”

然后是2个2字节整数,前面的是小版本号,后面的是大版本号。

最后是8个保留字节。

CRW数据块称为HEAP,结构如下:

首先是连续排列的(多个)数据记录dataRecord。接着一个偏置量表offsetTbl,最后是一个4字节整数,是偏置量表的(相对)偏置offsetTblOffset。

偏置量表offsetTbl内含有数据记录的入口地址(相对),其结构为:

2字节整数,为数据记录个数。接下来是每条数据的入口地址,每个长度为10字节,依次为类型(2字节),长度(4字节),偏置(4字节)。

根据offsetTbl可以找到每一个dataRecord。

Heap的解码顺序是:

首先根据Heap的绝对偏置量和长度找到offsetTblOffset位置,读出offsetTblOffset值;

然后定位到offsetTbl,读出entry个数;

根据每个entry的类型,或者直接获得数值,或者根据偏置定位到数据块。

在CRW的CIFF中比较有意思的是白平衡数据。首先是0x10A8的色温值:

Color Temperature:
20 数据块长度
2500 5200 7000 5976 3210 3888 6196 6770 5200

以及位于0x10A9的对应的RGGB系数,共41个短整数:
ColorBalance:
82 数据块长度
1344 945 946 1456
1698 831 832 988
1997 831 832 831
1841 831 832 897
1210 905 906 1689
1488 841 842 1405
1899 831 832 890
2088 831 832 877
1692 831 832 985
237 239 237 240

最后的四个值意义不明,有可能上面的值除以最后的四个值就是白平衡调整时的系数。

RAW数据的解码比较麻烦。

RAW数据的低2位和高10位是分别在两个数据块内存储。

低2位数据块的偏置是26,长度是RAW格式像素数的1/4。存储顺序是从左到右,从上到下。但每个字节内的4个2位数据是对应着从右往左顺序排列的4个像素。

高10位的主数据块在低位数据块的514字节后,是压缩数据。

CRW有3套解码表,由0x1835的tag指定。每套解码表生成2个解码树,dec1和dec2。

数据排列从上到下以8行分组,组内从左到右,每64个像元为一个单元依次排列。

每个单元内先用dec1解出第一个数据比特数leaf,然后改为使用dec2解码。

除单元第一个像元外,leaf为0,说明此单元解码结束,未扫描的像元为0;leaf为0xFF说明此像元为0;leaf的高4位不为0,表示要跳过leaf/16个像元。最后,leaf的低4位才表示真正的数据比特数。读出相应的数据后,如果此数的最高位是0,则表示是负值,需要取补码。

之后自左至右操作恢复像元值:

1)每个单元的第一个像元值要加上它前面单元的第一个像元值。整个RAW数据块中的第一个单元不加。

2)每个像元加上前面第2个像元的值,每行第1、2个像元则加512。

这样得出的10位数据加上前面的2位数据最终组合成12位RAW数据。