SSブログ

謎のJPEGファイルを修復 [ソフトウェア/PC関係]

JPEG・MPEG完全理解
「JPEG・MPEG完全理解」(コロナ社)

昨日,データを救出したCD-ROMの中に,いくつか妙なファイルを発見。拡張子がない上に,バイナリで先頭部分をダンプしても,ランダムな16進データのようで,何かのフォーマットのヘッダ部分という感じでもない。真空波動研でチェックしても,未対応形式と出てしまう。でも,ファイル名からすると,画像か映像か,その手のファイルのようなのだ。

試しに,1つのファイルの16進ダンプを先頭からつらつら見ていくと,ファイルの最後の方になって,JPEGファイルのヘッダ部分らしきものを発見。0xFF,0xD8,0xFF,0xE1,で始まる,JPEG-EXIFファイルの先頭部分だ。そもそも,こんなデータ列が,ファイルの終わりの方に出てくること自体おかしい。

改めて先頭からダンプを見直してみると,割と先頭の方に,JPEGの量子化テーブルやハフマン符号表っぽいデータ並びが見つかった。JPEGのファイル仕様を解説してるページを探してチェックしてみると,やっぱり見込みは当たっていた。で,量子化テーブルを収めるDQTセグメント(マーカ: 0xFF 0xDB)の前にしばらく「0」が続き,その前に「0xFF 0xD9」。これは画像データの終了を表すEOIのマーカーだろう。こんなところにEOIがあるということは,EXIFのサムネイルかもしれない。

もう一度ファイルの後ろへ戻って,SOIのマーカー(0xFF 0xD8)よりも前を確認してみると,ここも数十バイトの「0」を挟んで,「0xFF 0xD9」。ってことは,元々のファイルの頭が千切れて,お尻にくっついちゃったってことなんだろうか。何がどうしたら,こんなことが起きるのか分からないけど,これなら画像を救出することが出来るかも知れない。

ファイルの最後の部分は,SOIに続いてAPP1というEXIFの情報を収めたセグメントがあり,その中のサムネイルの画像データの途中で,ファイルの終端になっている模様。ファイルの先頭がサムネイルの画像データの途中から始まっていることにも合致する。ということで,取り敢えず,SOIのところでファイルを2つに分割し,前後入れ替えたファイルを作ってみた。これをそのまま画像ビューワで見てみたところ,さすがにフォーマット・エラーになる。どうも,サムネイルの画像データが一部欠落しているのか,APP1セグメントの長さが合わないのである。

まぁ,サムネイルの画像なんでどうでもいいので,取り敢えずJPEGファイルとして辻褄を合わせるために,5バイト目と6バイト目にあるAPP1の長さを修正。これは,APP1の次にあるセクション(この場合はDQT)のマーカー位置から,4を引いたものになる。5バイト目に上位バイトが来ることに注意。ついでに,ファイルの最後についてる,EOIに続く余分な「0」も削除。これを読み込んでみたら,無事,画像ビューワで画像が表示されるようになった。めでたし。元々,こういう壊れたバイナリ・ファイルをいじくり回して,なんとか使えるようにするって作業は好きなので,個人的にも結構楽しめた。それに加えて,修復されて見えるようになった写真を,依頼主の友人が喜んでくれたようなので,それもまた嬉しい。

同じようなファイルが他にもたくさんあったので,さすがに手作業でやる気にはなれず,久々にC言語で修復プログラムを書いた。驚くべきことに,標準関数のパラメータの順番とか,結構忘れている。これはヤバイですな。Perlばかり使わずに,たまにはCだのC++だのも,敢えて使うようにしないと,脳がどんどん退化してしまう...。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

CD-ROMの修復竜巻発生 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。