Compression is a Huffman tree and a quantization table.
これは圧縮形式がハフマン木と量子化テーブルから成り立っているということでいいのでしょうか?
もし、そうであるならば、この二つのことについて解説していただけませんでしょうか?
自分でも調べてみたのですが、ハフマン木の圧縮の仕組みはわかったのですが、それをnefファイルに適用する方法がわかりません。
また、量子化テーブルのほうはさっぱりわかりません。
dcraw というオープンソースのraw現像ソフトのソースに.nef形式のファイルの解凍?関数があったので、それをどうにか理解しようと思ったのですが、
全く手が出ませんでした。 特にしたの部分の関数の処理がわからないためそれ以上に処理を追うことができませんでした。
これほどに長いコードを読むのが初めてなのでなおのことどうにもなりません・・・
最終目的: .nefファイルから画像データを出力することです
まずなにから手をつければいいのか分からずにいるので、大まかな指針だけでも教えていただければ助かります。
以下はdcrawのサイトです
ttp://www.cybercom.net/~dcoffin/dcraw/
(nikon d5000のデータはvoid CLASS nikon_compressed_load_raw()内部のnikon_treeにおいてtree=0のときのようです)
/*
Construct a decode tree according the specification in *source.
The first 16 bytes specify how many codes should be 1-bit, 2-bit
3-bit, etc. Bytes after that are the leaf values.
For example, if the source is
{ 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff },
then the code is
00 0x04
010 0x03
011 0x05
100 0x06
101 0x02
1100 0x07
1101 0x01
11100 0x08
11101 0x09
11110 0x00
111110 0x0a
1111110 0x0b
1111111 0xff
*/
ushort * CLASS make_decoder_ref (const uchar **source)
{
int max, len, h, i, j;
const uchar *count;
ushort *huff;
count = (*source += 16) - 17;
for (max=16; max && !count[max]; max--);
huff = (ushort *) calloc (1 + (1 << max), sizeof *huff);
merror (huff, "make_decoder()");
huff[0] = max;
for (h=len=1; len <= max; len++)
for (i=0; i < count[len]; i++, ++*source)
for (j=0; j < 1 << (max-len); j++)
if (h <= 1 << max)
huff[h++] = len << 8 | **source;
return huff;
}
・.nef中に24bitRGBで保存されているプレビュー用の画像データの出力には成功
//使用言語
・C(vc++2008)