事例集 分割ファイルの結合に失敗したファイル Back
ここではニュースグループで画像のファイル転送に失敗し、複数のファイルがひとつのファイルになってしまった場合とひとつのファイルが複数に分割されてしまった場合の修復方法を説明します。
マイナーな例題ですがファイルの分割、結合という基本的な操作を説明していますので、似たような場面に応用してみて下さい。

ファイル分割

ニュースグループの画像投稿では、大容量のファイルの投稿を制限し、ファイルを分割して投稿する決まりになっています。
分割するサイズはそのグループ内での決まり事なのでまちまちですが…

そして、自動でダウンロードするニュースリーダでは、記事名:Subjectにより分割ファィルかを判断しているため、この記事名の書き方次第でダウンロードが失敗する場合が有ります。

ここでの例は、ダウンロードの失敗により、1つの画像ファイルに複数の画像が混入してしまった場合を説明します。
こう言ったファイルは一般の画像ビュアでは1枚目の画像しか見れませんが、エラーにならないので見つけるのが困難です。

Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [0010] APP0 :JPEG File Interchange Format Ver 1.1 (JFIF)
         密度 1:1 単位なし
00000014 [0043] DQT :Define Quantization Table
         00000018 QT0-8bit IJG輝度 画質80
00000059 [0043] DQT :Define Quantization Table
         0000005D QT1-8bit IJG色差 画質80
0000009E [0011] SOF0 :Start Of Frame 0 - Baseline DCT
         480[0] x 640[0] pixel - 24bit color (YCbCr 4:4:4)
         ComponentID-01 Y 1x1 QT0
         ComponentID-02 Cb 1x1 QT1
         ComponentID-03 Cr 1x1 QT1
000000B1 [001F] DHT :Define Huffman Table
         000000B5 HT0-DC 汎用輝度HT-DC
000000D2 [00B5] DHT :Define Huffman Table
         000000D6 HT0-AC 汎用輝度HT-AC
00000189 [001F] DHT :Define Huffman Table
         0000018D HT1-DC 汎用色差HT-DC
000001AA [00B5] DHT :Define Huffman Table
         000001AE HT1-AC 汎用色差HT-AC
00000261 [000C] SOS :Start Of Scan 0-63[00]
         HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
0000026F ****** Image Data ******
         Data Size 46,942 bytes
0000B9CD ****** SOI :Start Of Image ******
0000B9CF [0010] APP0 :JPEG File Interchange Format Ver 1.1 (JFIF)
         密度 1:1 単位なし
0000B9E1 [0043] DQT :Define Quantization Table
         0000B9E5 QT0-8bit IJG輝度 画質80
0000BA26 [0043] DQT :Define Quantization Table
         0000BA2A QT1-8bit IJG色差 画質80
0000BA6B [0011] SOF0 :Start Of Frame 0 - Baseline DCT
         480[0] x 640[0] pixel - 24bit color (YCbCr 4:4:4)
         ComponentID-01 Y 1x1 QT0
         ComponentID-02 Cb 1x1 QT1
         ComponentID-03 Cr 1x1 QT1
0000BA7E [001F] DHT :Define Huffman Table
         0000BA82 HT0-DC 汎用輝度HT-DC
0000BA9F [00B5] DHT :Define Huffman Table
         0000BAA3 HT0-AC 汎用輝度HT-AC
0000BB56 [001F] DHT :Define Huffman Table
         0000BB5A HT1-DC 汎用色差HT-DC
0000BB77 [00B5] DHT :Define Huffman Table
         0000BB7B HT1-AC 汎用色差HT-AC
0000BC2E [000C] SOS :Start Of Scan 0-63[00]
         HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
0000BC3C ****** Image Data ******
         Data Size 39,832 bytes

←一つ目のJPEG画像























←二つ目のJPEG画像

〜〜〜〜〜〜〜〜〜中間省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
001131CB ****** EOI :End Of Image ******

        ◆ SOIマーカが 30個有ります ◆

     Analyze End.

この例ではSOIマーカが30個有るということで、30個の画像がこのファイルに含まれていそうです。
JpegAnalyzerでは、リストの領域を選択せず分割ボタンを押すだけで、SOIマーカから次のSOIマーカの手前までを1ファイルとして分割します。

※分割の際、
設定>自動EOI付与にチェックが入っているとEOIが無ければ付けてくれます。
※リストの一部が既に選択状態になっていたら、リストをWクリックするか、リスト上にマウスカーソルを当て、ESCキーを押してください。非選択状態に出来ます。



ファイル名はそれぞれ元ファイル名に追い番が付与された物が、元ファイルと同じフォルダに作られます。
内部が破損していなければ、それぞれのファイルは正常に見れるようになるはずです。

もし、サイズだけ異常に大きいJPEGファイルがありましたら、JpegAnalyzerで調べてみて下さい。
このようなファイルが見つかるかも知れません。

ファイル結合

ここでは、分割されたファイルで結合に失敗しバラバラになった物を修復する例を説明します。
JpegAnalyzer では、このダウンロード失敗により3分割までのファイルなら簡単に結合することが出来ます。
4分割以上は、組み合わせてみないと判らないので手間はかかりますが不可能ではありません。

以下は3分割されたそれぞれの解析画面です。
上からパーツA、B、Cとします。

パーツA 262,144 bytes
Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [3845] APP1 :Exchangeable image file format (Exif)
         00000014-0000009D 0th IFD Tag = 11
         00000128-0000024D Exif IFD Tag = 24
         00000382-0000039F Interoperability IFD Tag = 2
         00000324-00000371 1st IFD Tag = 6
         00001000-000025E3 Thumbnail

00003849 [00C5] DQT :Define Quantization Table 【IJG 画質92】
         0000384D QT0-8bit IJG輝度 画質92
         0000388E QT1-8bit IJG色差 画質92
         000038CF QT2-8bit IJG色差 画質92
00003910 [01A2] DHT :Define Huffman Table 【汎用ハフマンテーブル】
         00003914 HT0-DC 汎用輝度HT-DC
         00003931 HT0-AC 汎用輝度HT-AC
         000039E4 HT1-DC 汎用色差HT-DC
         00003A01 HT1-AC 汎用色差HT-AC
00003AB4 [0011] SOF0 :Start Of Frame 0 - Baseline DCT
         2048[0] x 1536[0] pixel - 24bit color (YCbCr 4:2:2)
         ComponentID-01 Y 2x1 QT0
         ComponentID-02 Cb 1x1 QT1
         ComponentID-03 Cr 1x1 QT1
00003AC7 [000C] SOS :Start Of Scan 0-63[00]
         HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
00003AD5 ****** Image Data ******
         Image Data Break off at 247,083 bytes
         Address (00003AD5-0003FFFF)

        ◆ EOIマーカが有りません ◆
        ◆ テーブル ( QT2 ) が余分に定義されています ◆

     Analyze End.
SOIマーカから、イメージまでのセグメントが有り、
イメージの途中から切れています。

先頭のデータです。

QT2が余分と出ていますが正常ファイルでも
出るエラーなので、ここでは無視します。

パーツB 262,144 bytes
Address Length Message
00000000     <=== 不明な領域 262,144 bytes

        ◆ JPEGファイルでは無さそうです ◆

     Analyze End.
マーカ、セグメントが検出されません。
途中のデータです。

パーツC 207,194 bytes
Address Length Message
00000000     <=== 不明な領域 207,192 bytes
00032958 ****** EOI :End Of Image ******

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

     Analyze End.

EOIマーカが有ります。
最終のデータです。

プレビュー画面で見ながら修復していきます。パーツAから順に切れている部分にファイルを挿入していきます。
まずは、パーツAを読取ります。



パーツAだけでは、下がだいぶ表示されていません。

〜〜〜〜〜〜〜〜〜上側省略〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
00003AC7 [000C] SOS :Start Of Scan 0-63[00]
         HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
00003AD5 ****** Image Data ******
         Image Data Break off at 247,083 bytes
         Address (00003AD5-0003FFFF)

        ◆ EOIマーカが有りません ◆
        ◆ テーブル ( QT2 ) が余分に定義されています ◆

     Analyze End.


※注意※
←この行より上はセグメントの中間に挿入されてしまう
←ここから下の行を1行選択しファイル挿入





解析リストのSOS/イメージデータ表示より下の行を1行選択し、ファイル挿入でパーツBを挿入します。
行を選択し、[Shift]キーを押しながら目的のファイルをドラッグ&ドロップすることも出来ます。
ドロップして挿入する場合、[Shift]キーを押すのはドロップ直前にしないと、エクスプローラが複数のファイルを選択する場合があるので注意して下さい。
それと、挿入行を選択しておかないとメニューは無効となります。ドロップ操作も失敗します。




パーツAにパーツBを挿入した結果です。あと少しで正常に戻りそうです。

同様に、パーツCを末尾に挿入します。

Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [3845] APP1 :Exchangeable image file format (Exif)
         00000014-0000009D 0th IFD Tag = 11
         00000128-0000024D Exif IFD Tag = 24
         00000382-0000039F Interoperability IFD Tag = 2
         00000324-00000371 1st IFD Tag = 6
         00001000-000025E3 Thumbnail

00003849 [00C5] DQT :Define Quantization Table 【IJG 画質92】
         0000384D QT0-8bit IJG輝度 画質92
         0000388E QT1-8bit IJG色差 画質92
         000038CF QT2-8bit IJG色差 画質92
00003910 [01A2] DHT :Define Huffman Table 【汎用ハフマンテーブル】
         00003914 HT0-DC 汎用輝度HT-DC
         00003931 HT0-AC 汎用輝度HT-AC
         000039E4 HT1-DC 汎用色差HT-DC
         00003A01 HT1-AC 汎用色差HT-AC
00003AB4 [0011] SOF0 :Start Of Frame 0 - Baseline DCT
         2048[0] x 1536[0] pixel - 24bit color (YCbCr 4:2:2)
         ComponentID-01 Y 2x1 QT0
         ComponentID-02 Cb 1x1 QT1
         ComponentID-03 Cr 1x1 QT1
00003AC7 [000C] SOS :Start Of Scan 0-63[00]
         HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
00003AD5 ****** Image Data ******
         Data Size 716,419 bytes
000B2958 ****** EOI :End Of Image ******

        ◆ テーブル ( QT2 ) が余分に定義されています ◆

     Analyze End.



これで修復完了です。プレビュー画面も正常に表示し、解析リストも通常のエラーのみとなりました。
出来上がった領域を、保存ボタン、またはファイルメニューから、名前を付けて保存でファイル化します。



注1
カメラの機種によってQT2が余分に定義されていますのエラーが出力する場合があります。
DQT上でQT2が記録されているのにSOFでは割り当たっていないために出力されます。
DQT上のQT2は無駄な領域で削除してもかまわないのですが、そのままでも運用上問題ありません。

注2
誤フォーマットやメディアのトラブルで読めなくなってしまったメディアをリカバリーツールで読み出した場合、このようにファイルがバラバラに分割されて復元されることがあります。

多数の分割ファイルを組み立てるのはJpegAnalyzerでは効率が悪いので、専用ツールを作っています。
未完成品で不具合が出る恐れがありますし、最低限のインターフェィスしか用意していないので、マニュアルを読まないと全く使い方が判らない代物です。
ホームページのジャンク置き場
JpegSalvageと言う名前で置いていますので、困った時はお使い下さい。

Top