事例集 リスタートマーカ化けの修復例 |
イメージデータの部分的な破損
修復前 修復後 写真提供:柴田義孝さん
この写真はJpegAnalyzer をご利用頂いている方から相談を受け、その時戴いたサンプルです。
所々、横棒やゴミが見え画像データが破損しているのが判ります。
Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [1E63] APP1 :Exchangeable image file format (Exif)
00000014-0000009D 0th IFD Tag = 11
0000010E-00000257 Exif IFD Tag = 27
000002D0-000002ED Interoperability IFD Tag = 2
000002EE-00000353 1st IFD Tag = 8
00000364-00001E66 Thumbnail
00000364 ****** SOI :Start Of Image < Thumbnail > ******
00000366 [00C5] DQT :Define Quantization Table QT0-8bit QT1-8bit QT2-8bit
0000042D [01A2] DHT :Define Huffman Table HT0-DC HT0-AC HT1-DC HT1-AC
000005D1 [0011] SOF0 :Start Of Frame 0 - Baseline DCT
Image size 160 x 120 pixel - color[YCbCr]
Component-Y 2x1 QT0
Component-Cb 1x1 QT1
Component-Cr 1x1 QT2
000005E4 <=== 不明な領域 6,273 bytes
00001E65 ****** EOI :End Of Image < Thumbnail > ******
00001E67 [00C5] DQT :Define Quantization Table QT0-8bit QT1-8bit QT2-8bit
00001F2E [01A2] DHT :Define Huffman Table HT0-DC HT0-AC HT1-DC HT1-AC
000020D2 [0004] DRI :Define Restart Interval (MCU blocks=4)
000020D8 [0011] SOF0 :Start Of Frame 0 - Baseline DCT
Image size 1280 x 1024 pixel - color[YCbCr]
Component-Y 2x1 QT0
Component-Cb 1x1 QT1
Component-Cr 1x1 QT2
000020EB [000C] SOS :Start Of Scan
HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
00002705 ****** ▲ RST0 順序異常 (未検出RST7 00002604-00002704)
00008910 ****** ▲ RST3 順序異常 (未検出RST2 0000874E-0000890F)
←RST順序異常が多発
〜〜〜〜〜〜〜〜〜中間省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 000497E5 ****** ▲ RST1 順序異常 (未検出RST0 000496A7-000497E4)
00050513 ****** ▲ RST0 順序異常 (未検出RST7 0005045E-00050512)
Image Size 325,336 bytes
Address (000020F9-000517D1)
▲ イメージ残存率 99% - 2534:2559 不足RST = 25
000517D2 ****** EOI :End Of Image ******
◆ イメージデータ領域に異常な部分が有ります ◆
◆ 異常な領域・セグメントがあります ◆
Analyze End.
画像データ部分にRST 順序異常が多発しているのが判ります。
画像データの部分なので、始めは修復不可能とお答えしていました。
修復のきっかけはサムネイル内のマーカ化け
0x000005E4番地に不明な領域が有ります。その部分をダンプすると以下のデータが書かれていました。
F9 DA 00 0C 03 01 00 02 11 03 11 00 3F 00 FA FE 7B BD 以降省略
2バイト目の0xDAや前後の構成から、この部分はSOS(0xFFDA)ではないかと考えて、先頭のF9を0xFFに変えてみたら、サムネイルの部分は以下の様になり、サムネイルが表示出来るようになりました。
00000364 ****** SOI :Start Of Image < Thumbnail > ******
00000366 [00C5] DQT :Define Quantization Table QT0-8bit QT1-8bit QT2-8bit
0000042D [01A2] DHT :Define Huffman Table HT0-DC HT0-AC HT1-DC HT1-AC
000005D1 [0011] SOF0 :Start Of Frame 0 - Baseline DCT
Image size 160 x 120 pixel - color[YCbCr]
Component-Y 2x1 QT0
Component-Cb 1x1 QT1
Component-Cr 1x1 QT2
000005E4 [000C] SOS :Start Of Scan
HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
Image Size 6,258 bytes
Address (000005F2-00001E64)
00001E65 ****** EOI :End Of Image < Thumbnail > ******
←正常になった
同様な事が画像データにも起きていないか、今度は画像データ部分をダンプして見ました。
RSTは0から始まり、一つづつ番号が増えていき、7までいくと次は0に戻り、また一つづつ番号が増えます。
JPEGファイルはこのようにして、データのブロック抜けを監視しています。
サンプルの画像ではDRIの値が4なので、以下のような感じでデータが並びます。
00002705 ****** ▲ RST0 順序異常 (未検出RST7 00002604-00002704)
エラーの意味ですが、本来RST7を検出する順番なのにRST0を検出した事を意味しています。
データの並びとして以下のような感じです。
アドレス0x00002705には検出されたRST0(0xFFD0)が有ります。
リストの右端に欠落範囲が載ります。その先頭アドレスの直前に正常なRST6(0xFFD6)が有ります。
RST6からRST0までの間(リスト欠落範囲)にRST7のマーカ0xFFD7に類似したデータが書かれていないか調べ、そこをRST7(0xFFD7)に書き換えてみました。
002600 5F 53 FF D6 C1 68 94 26 E0 08 02 A1 F2 DC 96 0F _S.ヨチh.&...。.ワ..
RST6
002610 D3 3D 85 7C CD 93 B3 3D FD 8A ED 11 56 61 B7 FF モ=.|ヘ.ウ=....Vaキ.
002620 00 AD 54 B5 45 3F 64 1E 4A 82 FD F3 C6 69 54 DB .ュTオE?d.J...ニiTロ
002630 42 A0 AF 23 32 58 4A 44 1B 63 03 EC 38 AA 77 E8 Bッ#2XJD.c..8ェw.
002640 64 8B 69 07 18 FC 6B 2D D5 91 B3 BA 66 3C B8 8F d.i...k-ユ.ウコf<ク.
002650 C4 61 D4 61 76 86 0A 3F 8B B5 45 70 B2 4F A7 6A トaヤav..?.オEpイOァj
002660 93 23 10 C1 43 02 79 C6 0D 67 18 59 EA 5B 9E A8 .#.チC.yニ.g.Y.[.ィ
002670 FE D7 F0 7B 99 AF 24 9F 4C 92 DC 79 93 42 C9 73 .ラ...ッ$.L.ワy.Bノs
RST7が化けた箇所
002680 14 80 67 77 1C E3 F0 C8 CD 7B 37 83 EE 27 D4 FC ..gw...ネヘ.7..'ヤ.
002690 27 6F 2E F2 70 A0 30 FC 2B E4 A9 F3 29 38 74 3E 'o..p0.+.ゥ.)8t>
0026A0 AA A4 62 A9 A6 BA 1A D7 62 38 7C 35 2C 51 A8 F3 ェ、bゥヲコ.ラb8|5,Qィ.
0026B0 70 7A 57 9C 78 CE 3B 6D 3F 43 BB BE 98 A8 B9 20 pzW.xホ;m?Cサセ.ィケ
0026C0 E0 1E F4 E5 1E 66 9B 31 84 EC 78 77 88 BC 49 36 .....f.1..xw.シI6
0026D0 FB B8 E3 99 8F 98 C7 39 6C FE 43 B5 72 97 D2 19 .ク....ヌ9l.Cオr.メ.
0026E0 A5 67 6C 74 EA 7B 1A F5 F0 54 6D 14 CF 3B 1F 5A ・glt.....Tm.マ;.Z
0026F0 F2 E5 45 29 4C 71 8E 70 7D 6A 30 E4 0E 00 C7 AD ..E)Lq.p.j0...ヌュ
002700 7A 11 5A 1E 71 FF D0 F8 31 98 00 59 46 40 E1 B3 z.Z.q.ミ.1..YF@.ウ
RST0
002710 DB E9 4C 39 67 C9 C1 06 B3 51 29 0A A0 A8 21 53 ロ.L9gノチ.ウQ).ィ!S
002720 07 BF 6A 55 52 40 21 4E FE A2 98 96 AC 0F 1C B0 .ソjUR@!N.「..ャ..ー
002730 1B 8F 42 B4 AA A7 3F 31 1C 7E B4 EC 98 20 D8 42 ..Bエェァ?1.~エ.. リB
002740 95 38 2A 39 06 95 50 B1 1C 8C E3 24 91 49 A0 4F .8*9..Pア...$.IO
002750 53 FF D1 F8 3B CB 2D 92 0F CF 8C 1C 1A 61 8B 9E S.ム.;ヒ-..マ...a..
RST1
002760 48 00 74 A9 BD D0 D0 E8 D7 2C 18 37 04 D4 82 53 H.tゥスミミ.ラ,.7.ヤ.S
変更前 変更後
四角いブロックがきれいに無くなっています。
結果、全ての四角いブロックはRSTマーカ化けと判明、ブロックを除去することが出来ました。
JpegAnalyzer は、これに対し、RST修復補助機能を実装し、容易に被疑箇所をみつけられるようにしました。
ただ、このような破損はまれだと思いますので、同じような破損をしているから原因はRSTマーカ化けと考えず、ダンプ内容などから判断して下さい。
あと、修復後も所々変色やノイズ(ゴミ)が見られますが、MCU部分のデータ破損ですので、この部分はJpegAnalyzerで破損の検出、修復は出来ません。