クラスタエラーによって破損した JPEG ファイルの修復

概要

クラスタエラーによって破損した JPEG ファイルの修復を行ってみたときのメモ。破損JPEG画像修復ソフト試用記に、4つのソフトが紹介されているが、JpegAnalyzer Plus(JpegAna142)によってかなり良い修復ができたので、ここに記録として残す。

準備

JpegAnalyzer Plus を、ダウンロードし、解凍しておく。JpegAnalyzer Plus のページには、

Q Windows Vistaや64bit版のWindowsには対応していますか?
A 正式回答は「未確認」です。

 

とあるが、Windows 7 64bit の環境でもきちんと動作した。適宜JpegAnalyzer Plus オンラインヘルプを参照してほしい。

状況

スマホで撮影して、SDHC に保存していたファイルが、クラスタエラーと思われるエラーによって破損していた。Read error が出ていた。scandisc による修復を行い、あったかもしれないバックアップを上書きしてしまった。ファイル後半はデータが残っていたので、修復できるかを考えた。

破損ファイルは 2,799,000 バイトで、バイナリエディタでみると、40167(16進)まで0で埋まっている。つまり、262504 バイトが0で埋まっているという状況である。JPEG のヘッダ等はなく、肝心な部分が失われていることになる。

修復方法

大筋、以前表示出来たファイルが見れなくなった場合デジタルカメラ画像のヘッダー修復例を見るとわかるが、「JPEGの断片ファイルや先頭が欠落しているファイルはJPEGのヘッダー(SOIからSOSまで)やイメージデータの先頭が欠落すると通常は修復出来ません。」がしかし、「JPEGファイルの出力元がデジカメや特定のソフトの場合、同様の処理をしたJPEGファイルはヘッダー部分が同じか似た構造になります。
それを利用してヘッダー部分を付け替える事で画像が何が写っているか判るレベルまで修復出来る場合があります。」なので、やってみるのが良い。デジタルカメラ画像のヘッダー修復例に準じて行う。

基本的に撮像方法は変えていないので、

汎用ハフマンテーブルを使用していること
画像サイズ、サンプリング比が共通していること

という条件にはマッチする。まず、壊れたファイルを読み込ませると、

Address Length Message
00000000     <=== 不明な領域 2,798,998 bytes
002AB596 ****** EOI :End Of Image ******

◆ イメージデータの断片かもしれません ◆

と表示される。ここが重要だが、次に、「メニュー: 設定 -> マーカ・セグメント誤検出防止 -> 全てOFF」とすると、

Address Length Message
00000000     <=== 不明な領域 262,540 bytes
0004018C ****** RST3:Restart Interval Marker
         14,578個のRSTで挟まれた画像データ領域を検出
002AB596 ****** EOI :End Of Image ******

◆ イメージデータの断片かもしれません ◆
◆ DRIセグメントが有りません ◆

となる。

よって、ヘッダー修復機能をまず試した。続いて、「ツール -> ヘッダー修復 -> ヘッダー挿入」で、同時期に撮影した、別の JPEG ファイルを読ませた。縦横はあっているほうが望ましいと思われる。すると、

Address Length Message
00000000 ****** SOI  :Start Of Image ******
00000002 [0010] APP0 :JPEG File Interchange Format Ver 1.2 (JFIF)
密度 1:1 単位なし
00000014 [006B] COM :Comment
                                  Header Repaired by JpegAnalyzer Plus V1.42. ImageFile-201404
                                  17_205451.jpg HeaderFile-20140417_205516.jpg.

00000081 [0084] DQT :Define Quantization Table 【IJG 画質98】
                                  00000085 QT0-8bit IJG輝度 画質98
                                  000000C6 QT1-8bit IJG色差 画質98
00000107 [0004] DRI :Define Restart Interval (MCU blocks=4)
0000010D [0011] SOF0 :Start Of Frame 0 - Baseline DCT
                                  3264[0] x 2280[0] pixel - 24bit color (YCbCr 4:2:2)
                                  ComponentID-01 Y 2x1 QT0
                                  ComponentID-02 Cb 1x1 QT1
                                  ComponentID-03 Cr 1x1 QT1
00000120 [01A2] DHT :Define Huffman Table 【汎用ハフマンテーブル】
                                  00000124 HT0-DC 汎用輝度HT-DC
                                  00000141 HT0-AC 汎用輝度HT-AC
                                  000001F4 HT1-DC 汎用色差HT-DC
                                  00000211 HT1-AC 汎用色差HT-AC
000002C4 [000C] SOS :Start Of Scan 0-63[00]
                                  HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
000002D2 ****** Image Data ******
                                  Data Size 2,527,023 bytes
00269201 ****** EOI  :End Of Image   ******

となった。このまま、保存ボタンを押すと、修復されたファイルが保存された。

repair_resized

こんな画像である。とてもきれいである。画像サイズは 3264 x 2280 であり、ファイルサイズは 2,527,747 バイトとなった。本来の画像は 3264 x 2448 であるため、画像の上部分が削除されたと思われるが、修復としては十分である。

misc

Posted by tako