ベトナム的生活トップページ > 壊れたJpeg画像の修復?
ベトナム的生活メニュー
Vietnamic Life Menu
ベトナムへ行く前に必読
ベトナム基本情報ベトナムならではのコト
漢字でベトナム1ベトナムの地名を漢字に変換.
漢字でベトナム2日本語から何となく想像できそうなベトナム語
雑記サブメニュー2004年からの雑記
ベトナム語IMEのVietKeyとUnikeyの使い方の説明
PCでベトナム語入力2Windowsの設定方法と各種アプリでの使用方法
無線アンテナの自作案てな工房さんの記事を参考にアンテナの自作
Jpeg画像の修復突如,読めなくなったSDカードから画像を修復するには.
Pentax Optio W10防水デジカメで遊ぶ
Sony Ericssonで遊ぶベトナムの携帯電話を楽しむためのページ.
Wata's SUZUKI APVスズキのミニバンAPVに関するまとめ
GPSmileパワーアップVietMap専用端末をWinCE汎用端末にする.
2006年1月30日,Pentax *Ist DSを使用中にSDカードの内容が突然表示できなくなりました.
本題にはいる前に使用機材,設定等を少々書いておきます.
カメラ:Pentax *Ist DS
SDカード:SanDisk 512MB
画像記録サイズ:4M
画質:三ツ星(注;*Ist DSの画質設定はRAW,三ツ星,二つ星,一つ星の4段階で三ツ星はJPEGでは最高画質です.)
表示できなくなるあたりの経過は以下の通り.
1:「カードが一杯」という表示.
2:あわてて画像を2枚消去.
3:サムネイル表示に切り替え.
4:サムネイルに?マークが現れる.
5:適当に1枚選んでOKボタンで選択するものの「画像を表示できません」と表示されるだけ.
その後は,カメラでダメやったらPCから読み込もうと考えメモリーカードリーダにSDカードを差し,USBをブスゥとPCに差し込みました.
エクスプローラで覗くと,SDカードが一杯になるような画像はなし.63枚です.
通常,メモリーカードが空の場合226枚撮れます.
そもそもなんで画像を表示できないのでしょう?
エクスプローラで詳細表示に切り替えると

画像の容量が8KB,16KBとは!
さらに状況をつかむため,エクスプローラでSDカードのプロパティを見ると,使用領域がほとんどで空き領域がほんのひとカケラだけです.
片方ではファイルは63個640KBしかなく,片方ではカードほぼ一杯のデータ500MBがあることになります.
ま,実際に撮影しているのですから3分の1くらいは使用領域でないといけないのですが.
ディスクの異常です.ということはスキャンディスクでしょ.
で迷わず実行しました.
ちょっとしたエラー修復で元通りになるだろうという希望はもろくも消え去りました.
実に1万個もの.CHKファイルが生成されました.
うーん.
スキャンディスクが終わったらデフラグかけるか!もう勢いですな.
もちろん,デフラグかけたところでどうにもなりませんでした.
さて,ココまでを振り返るといくつか対応に間違いと考えられる箇所があります.
今考えるとアホです.
カードが一杯とのメッセージにあわてて画像を消したこと
スキャンディスクをかけた.断片化したファイルをそのままにしてデータ復旧ソフトか何かに頼るべきでしたが,そこまで思い至りませんでした.
デフラグをかけたこと.これで断片化したデータの連続性が失われたことになります.
まとめると,エラーが出た時点の状態から一切書き込みを行わないのが復旧には最も都合がよいのに,不必要にディスクへのアクセスを行ったことです.
まぁ,やってしまったものはしょうがないですわな.
それでは復旧にかかりましょう.
まず,上記間違いから考えてこれ以上SDカードを直接さわりたくないので,SDカード内の全てのファイルをHDDにコピーしました.
(以上. 当ページを読まれた数名の方からHDDに移してから作業を行うほうが良いとのアドバイスをいただきました.
すでに,その様にやっていたのですが,本文中に明記していませんでした.アドバイスをしていただいた方には,この場を借りてお礼を致します.有り難うございます.)
1万個に及ぶCHKファイルが画像の断片であると仮定しました.
WZエディターで読んでみました.
するとこんな感じ.
意味不明ですな.
バイナリ表示に切り替えます.

おお!なんか判別可能な文字になりました.
JPEGのほうも見ていきましょう.同じくWZエディターで開いてみます.

右の方にxifという文字が見えており,おそらくExifだろうと予想できます.この後にPentax Corporationなどの文字も見えてきます.どのJPEGをみてもFFD8で始まることが分かりました.
正常なJPEGファイルはファイルの終わりがFFD9です.
ところが,壊れたJPEGファイルは頭にFFD8があるものの,終わりのFFD9がありません.(8KBですから当然といえば当然!)
概念でいうと次のような状態であろうと仮定しました.
JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,JPEGファイル頭,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,CHK,
JPEGの開始であるFFD8はあるので,それに続くCHKファイルの中のFFD9を探して,それまでのCHKファイルを一つのファイルにまとめて,適当なJPEGファイルの後にくっつければ画像になるはずです.
書き忘れていましたが,スキャンディスクが生成したCHKファイルも8KBです.全てしめて100MBにしかなりません.
もしかしたらこれ以上は作らない仕様かも.
とすると,データ回収が全て済んでいないということになります.
WZエディターのGrepで該当フォルダ内の対象ファイル(CHK)の語句検索を行います.
1万個のCHKファイルにJPEGのファイルの始まりを表すFFD8は,なんと2272個,終わりを表すFFD9は2699個見つかりました.
画像の数に対して多すぎるFFD8とFFD9です.
一つのCHKファイル8KBの中にFFD8とFFD9を持つものもあります.
そんなに小さい画像があるのでしょうか?
さてと,これからCHKファイルをくっつけていく作業が始まります.
手で1万ものファイルをいちいち開いてコピペするなんていうのは人間がやる仕事ではありませんね.
マクロが必要なので,組もうと思いましたが,残念ながらVBAしか知りませんので,選択の余地はなくVBAで組んでみました.
ところが,Wordで読み込むとどうしても文字が変わってしまいます.あとは改ページとかの記号も入りまくります.困ったものです.Wordで読み込んでテキストでセーブしたものをWZで開くとバイナリが変わっているのです.これでは作業が進まない.
棚からぼた餅といいますか,上記のVBAを修正すると複数のワード文書を一つにまとめることが可能なのに気が付きました.利用価値があるかどうかは分かりませんが,複数のワード文書結合マクロファイルを作りました.
DocBond_docというファイル名です.ワードで開くと使い方が分かります.
VBAコードに興味のある方はダウンロードしてください.
あれこれ悩んだ末,ファイルの結合なんて作業はフリーウェアであるやろと思い立ちWEBで検索.
なんのことはない.いろいろあるやん.(安堵)
で,ダウンロードしたのが
簡単操作で,次々とファイルを結合させることが出来ます.Win2000でも問題なく動作します.
100個ほどファイルを結合させてから,エディタでFFD8からFFD9を検索しその箇所を抜き出し,名前を付けて拡張子.Jpgで保存してみましたが,画像が表示できません.
(注:ファイル結合ソフトは一度に100個までしか結合が出来ません.)
FFD8,FFD9だけという簡単なものではないようです.
もっとくわしくJPEGについて知る必要がある.と実感.
で,更にネットでJPEG解析プログラムとかデータの構造とかを説明したページなんかを見て回ります.
「Jpeg Analyzer」というソフトを見つけました.
紹介を読んで早速ダウンロード.
ヘルプが充実していて,JPEGについて理解を深めることが出来ます.
FFD8,FFD9以外のマーカーも解釈もJpegAnalyzerがしてくれます.なんとかなるかいな.
とりあえず,壊れたJPEG画像(8KB) をJpegAnalyzerで開いてみます.

FFD8はSOI(Start Of Image),FFD9はEOI(End Of Image)ですが,EOIがないとの解析結果が表示されています.SOIマーカ以前の無効なデータは,Exifの読みそこないです. SOF0(Start Of Frame 0)を見ると「640x480Pixel-24bit color」という情報が見えます. この640x480の画像とは何でしょ?
Jpeg Analyzerの編集メニューから「EOIの挿入」を選ぶと最終行にEOIが追加されます.
さらに編集メニューから「領域画像表示」を選ぶと,これ!

とりあえず,なんの画像かは分かります.あとはこれに合いそうなものを探してひっつけていけばよろしいのかと.
本来,2400x1600で撮っているのにどうしてこんな画像があるのかは不明.
640x480でもとりあえずOKです.
くっつけたCHKファイルも読み込んでみましょう.

いきなりUn Known Dataが400KBもあります.画像の切れ端の終端部分であると予想できます.
その次にはSOIが入ってSOF0に160x120という更にカワイイサイズの画像があることが分かります.
SOIからEOIまで選択して表示させると

160x120と小さいですがサムネイルも見つかりました.
ないよりはまし.希望が出てきました.
しかしまぁ,いろいろなサイズで画像を持っているものですね.
下は,2400x1600のデータ,でかすぎるのでココでは縮小表示です.

でかい画像も全く表示できないよりまし.
あとは,根気勝負ですか?
CHKファイルを頑張って1000個くらい結合させ,画像抽出を試みます.

これも2400x1600の画像です.(注:ココでは縮小して掲載.)
画像の9割程度は見えているのでしょうか?
ここまで来れば,あとはPhotoShopで切り貼りしていけばある程度もとに戻せるかもしれません.
頑張って続行します.
なぜ,そこまでするのか?正月に姪や甥にせがまれて撮った写真です.
写真を撮った直後に液晶画面で画像を見てすごく喜んでいたのに,ディスクエラーというチビちゃんには訳の分からないもののせいで,プリントできないなんてことは,可能な限り回避したいのです.
上の壊れた画像のJpegAnalyzerでの解析画面でも分かりますが,640x480の画像があったり,160x120の画像があったりとしますので, まずは正常な画像の解析画面を理解する必要があります.
過去に撮影した画像の解析をしてみました.簡単にまとめると次のような構造です.
A)SOI (2400x1600)
B)Exif
b1)SOI (Thumbnail 640x480)
b2)DQT, SOF0, DHT, SOS
b3)Image Data <app.40KB>
b4)EOI (Thumbnail 640x480)
b5)SOI (Thumbnail 160x120)
b6)DQT, SOF0, DHT, SOS
b7)Image Data <app. 4KB>
b8)EOI (Thumbnail 160x120)
C) DQT, DRI, SOF0, DHT, SOS
D) Image Data <app. 1500KB>
E) EOI
太字で表したAからEまでが基本です.640x480および160x120の画像はExifに含まれています.
Exif情報の中にb1からb4までの画像が一つ,b5からb8までの画像が一つで入れ子構造になっているのですね.
もう一度画面を見てみましょう.

SOF0のところに640x480の文字が見えるので,これはExif中の画像です.ということはSOIも本来の画像のSOIではなく,Exif中画像のSOIと理解できます. でダンプ画面でバイナリを見るとFFD8がファイルの先頭に見つかりました.
それに続くFFE1がExif宣言でその後に,アドレスの何番から何番までがサムネイル1,何番から何番がサムネイル2というふうにデータがあり, いよいよ08B8からサムネイルのSOIが始まっているのですね.
そしてこの画像の場合,Exifが抱え込んでいる画像の1部分しかないために,Exifに書かれているアドレスが無効なアドレスの指定として扱われているのではないかと考えられます.
構造リストで行くと
A)SOI (2400x1600): FFD8はあるけど解析画面に現れません.
B)Exif: 有効なExifとして認識されません.理由はここで指定しているアドレスがb3の途中から見つからないためと推測されます.そのため,A,B含めてUnKnownData として扱われています.
b1)SOI (Thumbnail 640x480): これが画像のSOIにすり替わっている
b2)DQT, SOF0, DHT, SOS: これも揃っています.
b3)Image Data <app.40KB>: ここが5KBで切れています.
という具合になっています.
推測を推測で終わらせないために,この画像を「Exif Reader V2.90」で読み込んでみました.画像は表示されませんが,Exif情報は生きています. そのため,UnknownDataと表示されていますが,この部分のデータがおかしいわけではないのでそのままおいておきます.
SDカードから回収した壊れたJpegファイル(8KB)がこの状態なので,細分化されたCHKファイルを順に繋げていけば (データがメディアの先頭から順番に書かれていると仮定して)下のような構造が出てくるはずです.
b3)Image Dataの残り <app. 35KB>
b4)EOI (Thumbnail 640x480)
b5)SOI (Thumbnail 160x120)
b6)DQT, SOF0, DHT, SOS
b7)Image Data <app. 4KB>
b8)EOI (Thumbnail 160x120)
C)DQT, DRI, SOF0, DHT, SOS
D)Image Data <app. 1500KB>
E)EOI
と考えて,先日上に貼り付けた画像を見るともろにそういうのが見えます.

この図のアドレス00000 UnknownDataはサイズからしてメイン画像の切れ端の残り.そして次行のEOIで一区切りです. 次に61BC9にもUnknownDataがありますが,こちらはややサイズがでかいような気がしますが,おそらくExif内のサムネイル1(640x480)のハズ. と思う理由は次行のSOIから見ていくと160x120の画像がありEOIがあって,2400x1600のイメージへと続いているからです.
この中で重要な役割を発揮しそうなのが160x120の画像です.サイズが小さいので完全回収出来る可能性が大です.
と一人勝手に盛り上がってきました.
****************
記事修正履歴
****************
2006年2月3日:初回アップロード
2006年2月4日:修正,加筆
2006年2月7日:データをHDDにコピーして作業していることを追記.加筆.