昨日はDNGファイルの中を見て、各画素の輝度情報とカラーフィルター配列情報が入っていることを確認した。
今回は引き続き、DNG変換前のオリジナルのRAWファイル(X-E2では「RAF」形式)の中を見て、DNG変換後とバイナリ比較した。
まずファイルサイズだが、昨日用いた画像のRAF形式のサイズが約32MBで、非圧縮でDNG変換した後も32MB程度とあまり変わらなかったので、これはRAFファイルの中は非圧縮で、直接見られるのではないか、と考えた。
そこで早速バイナリエディタ「Stirling」を用いて、DNG, RAFの両ファイルを開いてみた。
RAFファイルにおける画像(輝度)データの開始アドレスは不明だが、昨日のDNGの解析で、DNG側での画像データ開始アドレスは分かっている。そこで、DNGファイルの画像データの先頭から16バイトのデータ列で、RAFファイルの中を検索した。
すると、思惑通り画像データらしきデータ列が見つかった。画面下方向にざっと見てもDNGの方と同じようなので、おそらくこれがRAFでの生データだろう。見たところ、思った通り非圧縮で、DNG同様に1画素16bit(2byte)のリトルエンディアン形式で記録されているようだ。
おそらくここからファイル終端までが画像データだろうと言うことで、DNG,RAFそれぞれについて、データ開始アドレスからファイル終端までを切り取って、データのみの別ファイルに切り出した。切り出し後の両データは一致するはず。
ところが
ファイルサイズが一致しない。
バイト数を正確に調べると
DNGファイル(データ部分のみ):32,538,112 byte
RAFファイル(データ部分のみ):32,907,256 byte
差し引き、369,144 byte RAFの方が大きい。
やはり、DNG変換時に何か情報が欠落しているのか?
1画素当たり2byteで、画素数は4936×3296なので、
4936x3296x2=32,538,112
となり、DNGの方はデータ量がピッタリである。
とりあえず、DNGとRAFをシンクロスクロールして見ていくと
RAFの方にゼロデータ列発見。
調べていくと、どうやら1ライン(4936画素=9872 byte)毎に、後に112byteのゼロデータが入るようだ。
しかも、最終ラインの後は112byteではなく、何故か104byteである(下図)。
画像は3,296ライン有るので、ゼロデータのバイト数は
112×3,295 + 104 = 369,144
となり、上述の「RAFデータサイズ – DNGデータサイズ」に一致する。
両ファイルのサイズ不一致はこのゼロデータのせいのようだ。
このゼロデータに何か大切な意味があるとは思えないので、これを除去する。
Stirlingの「置換」で、「00 00」を置き換え文字無しで置換すると削除モードになるようなので、これでゼロデータを削除した。
ゼロ削除後、もう一度これを別名でセーブして、DNGファイルと比較すると
両者はバイナリ一致した。
まとめると下記の通りとなる。
- X-E2のRAWファイル(RAF)の輝度情報データ部分は、非圧縮、1画素2byte(リトルエンディアン形式)で記録されている。輝度の精度はおそらく14bit。
- 1ライン(9872 byte)毎に、112byteのゼロデータが入る。ただし最終ライン後は104byte。
- DNG変換後は、ライン間のゼロデータが除去されるだけで、各画素の輝度データ自体はリトルエンディアン形式そのままで転記される。
- カラーフィルター配列もそのまま転記される。
というわけで、安心してDNG変換を間に挟んだ処理を行える。
コメント