Exif、JFIF、JPEGなど
flymanは以前からExifの内容を表示させるアプリを作っている。かなり適当に作ったルーチンを、最近また見直している。
Exifとは、Exchangeable image file formatの略で、主にデジカメで撮影した画像に撮影情報などを追加するフォーマットだ。デジカメやスマホで撮影したJpeg画像の殆どに、Exif情報が書き込まれている。
ExifはJpegファイル専用の規格ではない。が、殆どのデジカメではRAW画像の他にはJpeg画像を出力している事だろう。
Exifには撮影状況の他、カメラのオーナー名やGPS情報などが書き込み可能だ。特にスマホではGPS情報を書くものが多いので、スマホで撮影した自宅の画像などをそのままネットに上げる事は推奨できない。デジカメでも、スマホと連動してGPS情報を記録するものがあるが、勝手にGPS情報を書く機器は殆ど無いと思う。
他にもExif情報にはサムネイルが含まれる事も多い。画像処理ソフトでぼかした内容がExifのサムネイルにも反映されているかはソフト次第なので、サムネイルから情報が漏れる可能性がある。注意が必要だ。
というわけで(?)、flymanはExifのハンドリングロジックを見直しているのだが、色々とわからない事が多い。
Exifは主にJpegファイルに追加される。そのJpegファイルである。これがはっきりしない。
Jpegファイルとは、何だろう? 拡張子が”.JPG"または”.JPEG"のファイル? 殆どの場合、この認識で問題ないのだが、先日、某画像処理ソフトでJpeg画像をリサイズしたら、拡張子は”.JPG"だったのにバイナリエディタで確認したら、内容がBITMAPだった。それでも拙作の画像ビュワーでは表示できてしまう。
狭義のJpegは、JPEG方式で圧縮された画像ファイルととらえるのが良さそうだ(本来のJPEGは、規格を設定した団体のこと)。一般に、Jpegの内容は、JFIFというフォーマットに基づき、Jpeg圧縮された画像、ということだ。
では、JFIFとは何か?
JFIFはJPEG File Interchange Formatの略で、Jpeg圧縮された画像を収めたファイルの標準的なフォーマットだ。実はExifはこのJFIFを拡張したフォーマットらしい。
Exifでは、圧縮ファイルはJPEG、非圧縮ファイルはTIFF形式で記録する事になっているが、個々の内容を定義したタグはTIFFに準拠している。
ややこしい。
ところで、Jpegファイルの内容は幾つかのセグメントに分けられ、各セグメントはマーカーで識別される。
Jpegファイルの先頭にはSOI(Start of Image)マーカー、末尾にはEOI(End of Image)マーカーが記入される。これらはセグメントを持たない、特別なマーカーだ。
SOIマーカーの値は$FFD8、EOIマーカーは$FFD9だ。
バイナリエディタでJpegファイルを開くと、先頭は必ず$FFD8になっている。なっていなければそれはJpegファイルではない。
さて。
Exifの仕様書によると、『APP1はファイルの始まりを示すSOIマーカの直後に記録しなければならない』となっている。Exif情報はこのAPP1セグメント内に記載される。
APP1のタグは$FFE1なので、Exif情報を含むJpegファイルをバイナリエディタで開くと、先頭は
FF D8 FF E1
となっているはずだ。
ところで、先に述べたJFIFフォーマットはAPP0セグメントに書かれ、マーカーは$FFE0だ。
JFIFの仕様書は英語のモノしか見つけられなかったが、そこには『The JPEG FIF APP0 marker is mandatory right after the SOI marker.』と書かれている。つまりSOI直後に書け、ということだ。
JFIFフォーマットのJpegファイルをバイナリエディタで開けば、先頭は
FF D8 FF E0
のはずだ。
これらを読むと、JpegファイルはSOIマーカーの直後にAPP0(JFIF)またはAPP1(Exif)のいずれかを書ける事になるが、両方は書けない。まあ、ExifがJFIFの拡張仕様なら、この二者択一は納得できる。
ところが、拙作のExifビューワーで色々なJpegファイルを見てみると、仕様から外れていると思われるものが散見される。
例えばPaintShopProでリサイズした画像は、SOI直後にAPP0、その後にAPP2、APP1と続く。元の画像のセグメントの前にAPP0とAPP2を挿入しているようだが、APP1がSOI直後にないのは仕様違反だろう。まあ、拡張子”.JPG"でBitmapファイルを吐くようなソフトだし。
でも、Exifビュワー的には、腹立たしい。
また、Exifの主画像を記載すべき0th IFD(Image File Directory)があるにもかかわらずタグが0の画像もあった。記載が必須のタグも書かれておらず、ただ空のAPP1を記入するのも仕様違反な気がする。
仕様違反ではないが、Huaweiのスマホの画像では、EOIマーカーの後ろに何やら色々書かれている(中華的なアレか?)。他にも、セグメントの隙間に不明な情報が書かれているケースもあり(CANONのデジカメ)、奥が深いぞ、JPEG画像。
なお、ネット上にはJFIFもExifも無いJpeg画像も多々存在する。恐らく故意に削除しているのだろう。正しい対応だと思う。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/1233
この投稿には、まだコメントが付いていません