Exifについて BackIndexNext
ExifはJFIFに次いで一般的なJPEGファイルのフォーマット規格です。
デジタルカメラ画像のファイルフォーマットを規定しており、その後に出来たDCFというデジタルカメラ用の規格もExifフォーマットを採用しています。
(DCFは互換性やファイル管理などの部分も含めたExifより広範囲を規定した規格です)

このExif規格のファイルでは、非圧縮ファイルはTIFFフォーマット、圧縮ファイルはJPEGフォーマットを採用しています。
Exif規格のJPEGファイルには、Exifデータ用のアプリケーションセグメントが記録され、その中にデジタルカメラの撮影情報などが記録されています。

Exif規格のJPEGフォーマットに関する主な規定

Exifは限定した仕様となっていますので、汎用性は無い代りに明確で、壊れた時は扱い易いです。
但し、Exifセグメントを出力しても規格から外れたフォーマットを出力するデジカメや、画像を再加工して規格から外れたフォーマットになった画像もありますので注意して下さい。

・ファイル名にASCII英数字を使い、拡張子を含まない名前部分は8文字以内、拡張子に".JPG"を使用する

・以下のマーカ・セグメントを使用する
 SOI,APP1,DQT,DHT,SOF0,SOS,EOI(オプションでAPP2,DRI)
 他のAPPやCOMは含めない事となっていますが、読取りはそれらが有れば読み飛ばす事となっています。
 通常一つのファイルに各種一つだけマーカ・セグメントを記録し、APP2だけは複数有っても良い事になっています。

・マーカ・セグメントの記録順序
 SOI,APP1,(APP2),[DQT,DHT,SOF0,(DRI)],SOS,EOI
 [鍵括弧]内の順序は自由、(括弧)内はオプション、EOI以降は規定しない(何を記録しても良い)

・DQTは最大3つのテーブルまで、一つのセグメントに連続で記録する

・DHTはDCとAC一組でコンポーネント対応し、一つのセグメントに連続で記録する
 ※JPEG規定により、Baselineはテーブル番号0、1のみ使用出来る
 ※DCFの規定により、汎用ハフマンテーブルを使用する

・リスタートインタバルはオプションで、リスタート間隔は64ピクセル毎(DRIのMCU数は4固定)

・SOFはBaseline(SOF0)、色空間はYCbCr、サンプリング比は4:2:0または4:2:2に規定

参考資料
JEIDA規格 ディジタルスチルカメラ用画像ファイル フォーマット規格(Exif) Version 2.1 (日本語版) Exifj.pdf
JEIDA規格 カメラファイルシステム規格(Design rule for Camera File system)DCF Version 1.0 (日本語版) DCFj.pdf


Exifフォーマットについて

APP1(Exif)セグメント内部はTIFFフォーマットで記録されています。
TIFFフォーマットは、IFDというデータブロックを芋づるのように記録するWindowsのディレクトリー構造に似たフォーマットです。

ExifはJPEGファイルの他にTIFF形式のファイルでもサポートしており、JPEGではAPP1セグメントとして記録されます。
以降、JPEGのAPP1セグメントの内部のTIFF構造について説明します。

Exif構造図

Exifは上図のような構造になっており、各IFDに記録される情報は以下の通り

IFD 内容 画像 タグ
0th IFD 主画像に関する情報 有り TIFF6.0準拠
1st IFD サムネイル(縮小された見本画像)に関する情報 有り TIFF6.0準拠
Exif IFD カメラ撮影情報 - プライベート
GPS IFD GPS測位情報 - プライベート
互換性 IFD Exifフォーマットの互換性情報 - TIFF6.0準拠
Makernote メーカ固有情報(メーカや機種によりフォーマットが異なります) 一部有り -
PrintIM Print Image Mating(IFD形式ではありません) - -

※ 0th IFD以外は、カメラの機種によっては記録されない場合も有ります。

全体の構成がわかった所で、次は具体的にどのようなデータが書かれているかを見ていきます。


APP1セグメント・TIFFヘッダー

APP1Exifセグメントの先頭部分

上図の通り、Exif識別コード(ASCII文字で"Exif")の次にTIFFヘッダーが書かれます。

TIFFヘッダーの先頭2バイト(バイトオーダ)にはエンディアンを識別する意味のコードが書かれます。
 BigEndian   0x4D4D (Ascii=MM) 位の高いバイト順から書かれる
 LittleEndian 0x4949 (Ascii=II) 位の低いバイト順から書かれる


次の2バイト0x002AはExifでは固定です。
IFDオフセットには0th IFDの先頭位置が書かれます。

この位置の基準がTIFFヘッダーの先頭位置になり、以降のIFDのアドレス(オフセット)もTIFFヘッダーから何バイト目かを表しています。

TIFFヘッダーの直後に0th IFDが通常有りますので、次のIFDオフセット(4バイト)には0x0000 0008が書かれます。
よって、TIFFヘッダーは通常、以下のどちらかの値が書かれます。

BigEndian  0x4D4D 002A 0000 0008
LittleEndian 0x4949 2A00 0800 0000


バイトオーダ(エンディアン)によって値が逆に書かれる事が理解できましたでしょうか?


IFD

IFDの構造

IFDは上図の形式で書かれており、カウント部が後に続くエントリーフィルドの個数となっています。
最後のオフセットは次にIFDがリンクしている場合、TIFFヘッダーからの位置が書かれます。
継続するIFDが無い場合は0が書かれ、通常0th IFD以外は皆0になります。
IFDも、その中のエントリーフィルドもTIFFヘッダーで指定されるバイトオーダに従って書かれますので注意して下さい。

タグの構造

エントリーフィルドは上図の形式になっています。

タグはデータを識別するコードで、数値毎に意味が異なります。
Exifで使用するタグの一覧表はExifの仕様書に記載されており、インターネット上でPDF文書が配布されていますので、必要な方は入手して下さい。

タイプはデータの型式を表します。(下表参照)
カウントは書かれるデータの個数です。
タイプ毎にデータの長さが異なりますから、タイプで指定される1単位のバイト数×カウントがデータの長さになります。

データの長さが4バイトまでならオフセット部にそのままデータが書かれます。
長さが5バイト以上なら別の場所にデータが書かれ、オフセット部にはデータの位置が書かれます。

個々のIFD間には、通常間が空いており、フィールドに収まらなかった長いデータは、IFD間に書かれます。

データの型式 タイプ値 データ長 備考
BYTE 0x0001 1 byte 8ビット符号なし整数
ASCII 0x0002 1 byte テキスト、最後はNULLで終端、長さはNULLも含めた値にする
SHORT 0x0003 2 byte 16ビット符号なし整数
LONG 0x0004 4 byte 32ビット符号なし整数
RATIONAL 0x0005 8 byte LONG2つの分数、一つ目が分子、二つ目が分母
SBYTE 0x0006 1 byte 8ビット符号付き整数
UNDEFINED 0x0007 1 byte 定義によりどんな値でも良い数値(長さは1バイト単位で指定)
SSHORT 0x0008 2 byte 16ビット符号付き整数
SLONG 0x0009 4 byte 32ビット符号付き整数
SRATIONAL 0x000A 8 byte SLONG2つの分数、一つ目が分子、二つ目が分母
FLOAT 0x000B 4 byte 実数
DFLOAT 0X000C 8 byte 倍精度の実数

Top


エンディアン(Endian)
Back
コンピュータは桁数や精度を必要とする計算を行う為、いくつかの長さのデータを扱います。
 8ビット(1バイト)
16ビット(2バイト)
32ビット(4バイト)
64ビット(8バイト)
ファイルは一般的に1バイト単位で記録され、
複数バイト長のデータは、上位バイトから記録するか下位バイトから記録するかが処理するプロセッサーで異なります。

上位バイトから記録(Big Endian)
モトローラ系プロセッサや、スパークなどのRISCプロセッサなどインテル系以外のもの
例)4バイトの変数
0x12345678をファイルに書いた場合 → 12 34 56 78

下位バイトから記録
(Little Endian)
インテル及びインテル互換プロセッサ

例)4バイトの変数0x12345678をファイルに書いた場合 → 78 56 34 12
書き込みと読込みが 同じ系統のCPUであれば、正しく読む事が出来ますが、別のCPUの場合、値がバイト単位に逆順で読み込まれるので、変換が必要です。