JPEGファイルの破損をチェックするPerlスクリプト
JPEG ファイルの破損を簡易的にチェックする Perl スクリプトの例。
概要
通常の JPEG ファイルは、最初に SOI マーカー (0xFF 0xD8) が置かれ、最後に EOI マーカー (0xFF 0xD9) が置かれます。さらに、それらの間がいくつかのセグメントに区分され、各々の先頭にマーカーが置かれます。画像データは、SOS マーカー (0xFF 0xDA) の直後に配置されます。
破損したファイルの多くは、SOI マーカーか EOI マーカーが欠損しています。また、SOS マーカーから EOI マーカーまでの間に欠損があると、ビューアで画像の一部が欠けて表示されます。
そこで、JPEG ファイルの SOI マーカーと EOI マーカーの有無をチェックすることで、ファイルが破損しているかどうかを判定します。
サンプルプログラム
use strict; use warnings; use File::Basename; my $filename = shift or die "Usage: ".basename($0)." example.jpg\n"; # バイナリファイルの読込 open my $rfh, "<", $filename or die "$!"; binmode $rfh; my $binary = join('', <$rfh>); close $rfh; # 先頭に SOI (0xFF 0xD8) が無ければ破損と判定 # SOS (0xFF 0xDA) のあと EOI (0xFF 0xD9) が無ければ破損と判定 unless ( $binary =~ /^\xFF\xD8[\x00-\xFF]*\xFF\xDA([\x00-\xFF]*)$/ && $1 =~ /\xFF\xD9/ ) { print "The file is damaged.\n"; }
補足
JPEG ファイルの破損をチェックする Windows 用のフリーソフトに、『JpegCleaner』があります (ただし、開発は終了)。また、『Jpeg Analyzer』で画像ファイルの詳細な解析ができます (JPEG 以外も対応)。これらのソフトは、以下のウェブサイトで配布されています。
※ JpegCleaner は「ジャンク倉庫」にあります。
参考 URL
→ JpegAnalyzer Plusオンラインヘルプ (JPEG ファイルについての詳しい説明があります)