圧縮ファイルの解凍(raw)?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
記事: 26
登録日時: 9年前
住所: 新潟

圧縮ファイルの解凍(raw)?

#1

投稿記事 by » 8年前

 デジタル一眼レフのraw(.nef形式 nikon d5000で撮影)を自分で現像するためにいろいろとやっていました。日本語の情報がまともに見つからないので、海外のサイトを調べていた中で、以下のような記述をみつけました。
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)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 圧縮ファイルの解凍(raw)?

#2

投稿記事 by softya(ソフト屋) » 8年前

とりあえず、printfデバッグでhuff配列の中身やsource配列,count配列,h,lenなどなどの変数の動きを表示してみたらどうでしょうか?
機能的には英語にあるコメント通りだとは思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

記事: 26
登録日時: 9年前
住所: 新潟

Re: 圧縮ファイルの解凍(raw)?

#3

投稿記事 by » 8年前

printfデバッグは試してみたのですが、
huffの配列の個数が1025個でまた、その変数の値を10進数16進数どちらでみても全く意味がとれませんでした・・・

>>機能的には英語にあるコメント通りだとは思いますが。
自分の勉強不足なだけなのですが、英語が大変苦手で、コメントを正確に和訳(理解)できていません
 自分では以下のように和訳したのですが、肝心の2文目の意味がうまく取れていません。
Construct a decode tree according the specification in *source.
複合化用のハフマン木を*source配列を種にして作る。
The first 16 bytes specify how many codes should be 1-bit, 2-bit,3-bit, etc.
 最初の16byteの種の個数が1,2,3・・・bit
Bytes after that are the leaf values.
葉の値がバイトの後に来る。
 なんかプログラミングの質問ではなく英語の質問になってしまって申し訳ありません。

追:
 uchar型は unsigned char と定義されていました。最初の投稿に表記しておくべきでした。すみませんでした。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 圧縮ファイルの解凍(raw)?

#4

投稿記事 by softya(ソフト屋) » 8年前

私も英語は得意とは言えませんが、
The first 16 bytes specify how many codes should be 1-bit, 2-bit,3-bit, etc.
最初の16バイトが、どれくらいのコードが1ビット、2ビット、3ビットなどでなければならないかについて明記します。
Bytes after that are the leaf values.
その後は、ツリーの葉の値です。

って感じでしょうか。

最初に本データではなくコメントで書かれているデータをsourceとして入れてみて、どんなツリーが出来るか確認されることから始めてはどうでしょうか?
あとは自分で一度簡単なので良いのでハフマン圧縮データの符号→復号のコードを書いてみるのが一番理解に成るかも知れません。
遠回りに見えるかも知れませんが理解度は飛躍的にアップすると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る