参考  :http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif.html サンプル:http://www.griffonworks.gwits.net/pub/PHOTO/E-20/PC030001.JPG ■Exif Marker [0x0000〜] FF D8 :JPEG ファイルヘッダ FF E1 :APP1 Marker 35 70 :APP1 Data Size 45 78 69 66 00 00:Exif Header ■TIFF Header [その続き] 4D 4D :データ形式 (4949:Intel型式 / 4D4D:モトローラ形式) ※Intel型式は値が逆さになる. 00 2A :必須 00 00 00 08 :最初の IFD へのオフセット値 (通常はこの後すぐに最初の IFD が始まるので 00 00 00 08 h 固定→8バイト) ■IFD0 (Image File Directory) [0x0014〜] *1:データ値へのオフセットは TIFF Header のデータ形式 (4D4D/4949) にオフセット値を足したものになる. (オフセット値は全て TIFF データの開始点 "II" または "MM" が格納されている場所から数える) 00 0B :IFD ディレクトリエントリ数 (11個) 01 0E :タグ番号 (データの種類を示す) [ImageDescription (ascii string):この画像についての説明が入ります.漢字等の2バイト文字の使用は禁止です.] 00 02 :データの格納フォーマット [ascii strings フォーマット.1個あたりの大きさは 1バイト] 00 00 00 20 :データの個数 [データの個数は 32個.データの大きさは 32個 x 1バイト = 32バイト] 00 00 0B 54 :データ値もしくはデータ値へのオフセット値 [データサイズが 4バイトを越えるので,ここにはデータの格納先オフセット値が入っている.TIFF Header のデータ形式アドレス 0x000C にオフセット値 0x0B54 を足したモノ 0B60 がデータ格納アドレスの開始となり,データの大きさはデータ格納フォーマットとデータの個数から計算して 32バイトになる.0x0B60 から 32バイト分は "OLYMPUS DIGITAL CAMERA " の 32バイト文字分入っている.] 01 0F :タグ番号 (データの種類を示す) [Make(ascii string):カメラのメーカー名を示します.Exif2.1ではオプションでしたが,DCFでは必須タグになりました.] 00 10 :データの格納フォーマット [signed rational フォーマット.1個あたりの大きさは 8バイト] 00 00 00 18 :データの個数 [データの個数は 24個.データの大きさは 24個 x 8バイト = 192バイト.しかしタグ番号で指定されている Make が文字列 (ascii string) なのでここは素直に 24バイト (192bit) として置いた方がいいだろう.] 00 00 0B 74 :データ値もしくはデータ値へのオフセット値 [データサイズが 4バイトを越えるので,ここにはデータの格納先オフセット値が入っている.TIFF Header のデータ形式アドレス 0x000C にオフセット値 0x0B74 を足したモノ 0B80 がデータ格納アドレスの開始となり,データの大きさはデータ格納フォーマットとデータの個数から計算して 24バイトになる.0x0B80 から 24バイト分は "OLYMPUS OPTICAL CO.,LTD" の 24バイト文字分入っている.] 01 10 :タグ番号 (データの種類を示す) [Model(ascii string):カメラの機種名を示します.Exif2.1ではオプションでしたが,DCFでは必須タグになりました.] 00 02 :データの格納フォーマット [ascii strings フォーマット.1個あたりの大きさは 1バイト] 00 00 00 11 :データの個数 [データの個数は 0x00000011 = 17個.データの大きさは 17個 x 1バイト = 17バイト] 00 00 0B 8C :データ値もしくはデータ値へのオフセット値 [データサイズが 4バイトを越えるので,ここにはデータの格納先オフセット値が入っている.上の計算で行くと,0x000C + 0x0B8C = 0x0B98 となり,ここから 17バイト取るので "E-20,E-20N,E-20P" となる.] 01 12 :タグ番号 (データの種類を示す) [Orientation(unsigned short):画像データーがどこを起点として,どの向きで格納されているかを示します.] 00 03 :データの格納フォーマット 00 00 00 01 :データの個数 00 01 00 03 :データ値もしくはデータ値へのオフセット値 01 1A 00 05 00 00 00 01 00 00 06 88 ------------------- 01 1B 00 05 00 00 00 01 00 00 06 90 ------------------- 01 28 00 03 00 00 00 01 00 02 00 00 ------------------- 01 31:Software (ascii string):デジカメのファームウェア(内蔵ソフトウェア)の版数を示します. 00 02:ascii string 00 00 00 20:0x20 = 32 (byte) 00 00 0B 9E:データへのポインタオフセット値 ------------------- 01 32 00 02 00 00 00 14 00 00 0B 40 ------------------- 02 13 00 03 00 00 00 01 00 02 00 00 ------------------- 87 69:ExifIFDPointer (unsigned long):Exif Sub IFDへのオフセットを示します. 00 04 00 00 00 01:データ数 = 1 00 00 00 FE:オフセット 0x00FE + 起点アドレス 0x000C = 0x010A ------------------- 00 00 02 00:Offset to next IFD = オフセット 0x0200 + 起点アドレス 0x000C = 0x020C ------------------- ■IFD1 (thumbnail image) [0x020C〜] ------------------- 00 06:Directory 6個 ------------------- 01 03:Compression (unsigned short):画像の圧縮形式を示します.'1'が非圧縮,'6'がJPEG圧縮です 00 03:unsigned short 00 00 00 01:データ数 = 1 00 06 00 00:Unsignd short なので前2バイトのみ取得.この場合 "6" なのでJPEG圧縮 ------------------- 01 1A 00 05 00 00 00 01 00 00 0D 8C ------------------- 01 1B 00 05 00 00 00 01 00 00 0D 94 ------------------- 01 28 00 03 00 00 00 01 00 02 00 00 ------------------- 02 01:JpegInterchangeFormat (unsigned long):サムネィル画像の圧縮形式がJPEGの場合に,JPEG画像データーが格納されている場所へのオフセットを示します. 00 04:unsigned long 00 00 00 01:データ数 = 1 00 00 1A 90:オフセット 0x1A90 + 起点アドレス 0x000C = 0x1A9C.ここへ飛ぶと JPEG 開始ヘッダ 0xFFD8 が存在する. ------------------- 02 02:JpegInterchangeFormatLength (unsigned long):サムネィル画像の圧縮形式がJPEGの場合に,JPEG画像データーのデーターサイズを示します. 00 04:unsigned long (2byte) 00 00 00 01:データ数 = 1 00 00 19 51:0x1951 = 6481(byte) これが JPEG サムネイルを作成したときのファイルサイズになる. ------------------- 00 00 00 00:End if IFD ------------------- ■Exif SubIFD [0x010A〜] ------------------- 00 15:Directory 0x15 (21) 個 ------------------- 82 9A:露光時間(シャッター速度の逆数)が入っています.単位は秒です. 00 05:符号無し分数(unsigned rational) 00 00 00 01:データ個数 = 1 → データサイズ = 符号無し分数のサイズ 8byte x データ個数 1 = 8byte 00 00 0C FC:データへのオフセット値 = 起点 0x000C + オフセット 0x0CFC = 0x0D08 になる.ここの 8byte を取ると 00 00 00 01 00 00 00 3C になり,符号無し分数の場合は前後 4byte を分離してそれぞれ分子と分母に割り当てる.この場合は 0x00000001/0x0000003C = 1/60 になるので,値は 1/60 秒となる. ------------------- 82 9D:レンズのF値が入っています. 00 05:符号無し分数(unsigned rational) 00 00 00 01:データ個数 = 1 → データサイズ = 符号無し分数のサイズ 8byte x データ個数 1 = 8byte 00 00 0D 44:データ = 起点 0x000C + オフセット 0x0D44 = 0x0D50 → 8byte を抜き出して 00 00 00 50 00 00 00 0A → 0x00000050/0x0000000A = 80/10 = 8 → レンズの F値 = F8.0 ------------------- 88 22:露光制御のモードが入っています.'1'はマニュアル設定,'2'は通常のプログラムAE,'3'は絞り優先,'4'はシャッター速度優先,'5'は低速プログラム,'6'は高速プログラム,'7'はポートレートモード,'8'は風景モードとなっています.E-20 の場合は 1/2/3/4 のみ. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 00 03 00 00:前 2byte を見てみると 0x0003 = 3 なので,これは「絞り優先」になる. ------------------- 88 27:CCD感度の銀塩フィルム換算値が入っています. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 00 50 00 00:前 2byte を見てみると 0x0050 = 80 なので,これは「ISO 80」となる. ------------------- 90 00:Exif形式のバージョンが4バイトのASCII文字("0210"等)で格納されています.このデーターはヌル(0x00)で終わっていないので,データー形式としてはAsciiStringではなくUndefinedが使われます. 00 07:undefined 00 00 00 04:データ数 = 4 = 4byte 30 32 31 30:文字になおすと 0210 になるので,Exif のバージョンは 0210 になる. ------------------- 90 03:オリジナル画像が撮影された日時を示します.形式は"YYYY:MM:DD HH:MM:SS"+0x00で,合計20バイトになります.時計が設定されていない等の理由で日時が不明な場合は,数値部分は空白文字(Space)で埋められています.この値は設定後は変更不可という仕様になっています.Exif2.1ではオプションでしたが,DCFでは必須タグになりました. 00 02:ascii strings 00 00 00 14:0x0014 = 20byte 00 00 0C B6:データ = 起点 0x000C + オフセット 0x0CB6 = 0x0D50 → 文字列なのでそのまま 20byte を抜き出して 文字列に変換.→ "2001:12:03 22:56:37" + 0x00 ------------------- 90 04:画像が撮影後にデジタル化された日時を示します.形式は"YYYY:MM:DD HH:MM:SS"+0x00で,合計20バイトになります.時計が設定されていない等の理由で日時が不明な場合は,数値部分は空白文字(Space)で埋められています.通常はDateTimeOriginal(0x9003)と同じ値が入っています.Exif2.1ではオプションでしたが,DCFでは必須タグになりました. 00 02:ascii strings 00 00 00 14:0x0014 = 20byte 00 00 0C CA:データ = 起点 0x000C + オフセット 0x0CCA = 0x0CD6 → 文字列なのでそのまま 20byte を抜き出して 文字列に変換.→ "2001:12:03 22:56:37" + 0x00 ------------------- 91 01 00 07 00 00 00 04 01 02 03 00: ------------------- 92 04:撮影時の露光補正量が入っています.単位はAPEX値(EV)です. 00 0A:single float (4byte) 00 00 00 01:データ数 = 1,データサイズ = 1 x 4byte = 4byte 00 00 0D 1C:オフセット 0x0D1C → 0x0D28 → 0x00000000 / 0x0000000A = 0/10 = 0? 例) EV 1.7:00 00 00 11 00 00 00 0A EV 1.3:00 00 00 0D 00 00 00 0A EV-1.3:FF FF FF F3 00 00 00 0A ------------------- 92 05:レンズの開放F値が入っています.ApertureValue同様,ルート2のベキ乗を取ると通常の絞り値に換算できます. 00 05:符号無し分数(unsigned rational) 00 00 00 01:データ個数 = 1 → データサイズ = 符号無し分数のサイズ 8byte x データ個数 1 = 8byte 00 00 0D 24:起点 0x000C + オフセット 0x0D24 = 0x0D30 → 8byte を抜き出して 00 00 00 CE 00 00 00 64 → 0x000000CE/0x00000064 = 206/100 = 2.06 → レンズの開放 F値 = F2.0 ------------------- 92 07:自動露出の測光モードを示します.'0'は不明,'1'は平均測光,'2'は中央重点,'3'はスポット,'4'は多点スポット,'5'はマルチセグメント(分割測光),'6'は部分測光,'255'はその他です. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 00 05 00 00:前 2byte を見てみると 0x0005 = 5 なので,これは「マルチセグメント(分割測光)」となる. ------------------- 92 09:フラッシュ発光の状態を示します.'0'はフラッシュ非発光,'1'はフラッシュ発光(反射光検出機構なし),'5'は発光したが反射光は検出できなかった,'7'は発光して反射光が検出できた事を意味します. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 00 01 00 00:前 2byte を見てみると 0x0005 = 5 なので,これは「フラッシュ発光(反射光検出機構なし)」となる. ------------------- 92 0A:レンズの焦点距離が入っています.単位はmmです. 00 05:符号無し分数 (unsigned rational) 00 00 00 01:データ個数 = 1 → データサイズ = 符号無し分数のサイズ 8byte x データ個数 1 = 8byte 00 00 0D 3C:起点 0x000C + オフセット 0x0D3C = 0x0D48 → 8byte を抜き出して 00 00 00 C8 00 00 00 0A → 0x000000C8/0x0000000A = 200/10 = 20 → レンズの焦点距離 = 20.0mm ------------------- 92 7C:カメラの内部情報等,メーカー依存データーが格納されています.Olympus/Nikon/Sanyo等,一部メーカーの場合は,このデーターもIFD形式で格納されています.Appendixを参照してください. 00 07:undefined (1byte) 00 00 03 56:データサイズ = データ個数 0x0356 (854) x 0x007 のデータサイズ 1byte = 854byte 00 00 02 6C:起点 0x000C + オフセット 0x026C = 0x0278 OlympusのMakerNoteは"OLYMP"という文字列で始まっています.冒頭から8バイト目以降はIFD形式のデーターとなっている. 参照:Appendix 1: OlympusのMakerNote ちなみに E-20 の場合は IFD のディレクトリ数がなんと 70.(汗) [0x0278〜] 4F 4C 59 4D 50 00 01 00 00-46 02 00 O L Y M P . . . ○ ○ ○○ = 0x0046 = 70 ------------------- 92 86:ユーザーコメントが格納されます.ImageDescriptionタグと違って,こちらはJIS2バイトコード,Unicode等での記述が許されており,最初の8バイトが文字コードを示します. '0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII '0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS '0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode '0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined 00 07:Undefined 00 00 00 7D:データサイズ = データ個数 125 x 0x007 のデータサイズ 1byte = 125byte 00 00 0C 2C:起点 0x000C + オフセット 0x0C2C = 0x0C38 ------------------- A0 00:フラッシュピックスのバージョンが入ります.FlashPix formar Ver.1.0に準拠している場合はASCIIキャラクターの"0100"が入っています.このデーターはヌル(0x00)で終わっていないので,データー形式としてはAsciiStringではなくUndefinedが使われます. 00 07:undefined 00 00 00 04:データ数 = 4 30 31 30 30:0x30313030 = '0100' → フラッシュピックスのバージョンは 0100 になる. ------------------- A0 01:使われる色空間を示します.DCFの場合は必ずsRGBを使用しますので,'1'が入ってます.sRGB以外の色空間を使用している場合は,'65535':Uncalibratedとなります. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 00 01 05 00:0x0001 = 1 ------------------- A0 02:メイン画像の大きさ (幅) が入ります. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 05 00 03 C0:0x0500 = 1280 pixels ------------------- A0 03:メイン画像の大きさ (高) が入ります. 00 03:unsigned short (2byte) 00 00 00 01:データ数 = 1 03 C0 01 02:0x03C0 = 960 pixels ------------------- A0 05:ExifR98/DCF仕様における拡張データーを格納するためのものです.IFD形式のデーター(Interoperability IFD)へのオフセットが入っています.DCF仕様では必須タグとなっています. 00 04:unsigned long (2byte) 00 00 00 01:データ数 = 1 00 00 02 4E:起点 0x000C + オフセット 0x024E = 0x025A ------------------- A3 00:画像がどういうデバイスから得られたかを示します.'0x03'はデジタルカメラで撮影された画像を意味します. 00 07:undefined 00 00 00 01:データ数 = 1 03 00 00 00:0x03 = デジタルカメラ ------------------- 00 00 00 00:Offset to next IFD 0x00000000 なので IFD はここで終わり. ------------------- ■Original IFD 02 00:撮影モード 00 04: 00 00 00 03: 00 00 0D B8:最初の値は0=通常モード,1=不明,2=速写モード,3=パノラマモード、次の値はパノラマの場合の通し番号、最後の値はパノラマの方向で、1=左から右、2=右から左、3=下から上、4=上から下を意味します。 ------------------- 02 01:撮影品質 00 03: 00 00 00 01: 00 02 00 00:1=SQ,2=HQ,3=SHQ ------------------- 02 02:撮影モード 00 03: 00 00 00 01: 00 00 00 00:0=標準撮影、1=マクロモード ------------------- 02 03: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 02 04:デジタルズームの比率 00 05: 00 00 00 01: 00 00 0D CC:0=なし、2=2倍ズーム ------------------- 02 05: 00 05: 00 00 00 01: 00 00 0D D4: ------------------- 02 06: 00 08: 00 00 00 06: 00 00 0D DC: ------------------- 02 07:ハードウェアタイプ 00 02: 00 00 00 06: 00 00 0D E8:D4029. (6byte) ------------------- 02 09:CameraID 00 07: 00 00 00 20: 00 00 0D EE:[OLYMPUS DIGITAL CAMERA ] 32byte (0x02byte) ------------------- 10 00: 00 0A: 00 00 00 01: 00 00 0E 10: ------------------- 10 01: 00 0A: 00 00 00 01: 00 00 0E 18: ------------------- 10 02: 00 0A: 00 00 00 01: 00 00 0E 20: ------------------- 10 03: 00 0A: 00 00 00 01: 00 00 0E 28: ------------------- 10 04: 00 03: 00 00 00 01: 00 02 00 01: ------------------- 10 05: 00 03: 00 00 00 02: 00 01 00 00: ------------------- 10 06: 00 0A: 00 00 00 01: 00 00 0E 38: ------------------- 10 07: 00 08: 00 00 00 01: 00 1F 00 1B: ------------------- 10 08: 00 08: 00 00 00 01: 00 1B 00 00: ------------------- 10 09: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 0A: 00 03: 00 00 00 01: 00 00 00 01: ------------------- 10 0B:フォーカスモード 00 03: 00 00 00 01: 00 01 00 00:0=AF,1=MF ------------------- 10 0C: 00 05: 00 00 00 01: 00 00 0E 4C: ------------------- 10 0D: 00 03: 00 00 00 01: 00 10 02 0D: ------------------- 10 0E: 00 03: 00 00 00 01: 02 0D 00 00: ------------------- 10 0F:シャープネス 00 03: 00 00 00 01: 00 00 00 00:0=Normal,1=Hard,2=Soft ------------------- 10 10: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 11: 00 03: 00 00 00 09: 00 00 0E CA: ------------------- 10 12: 00 03: 00 00 00 04: 00 00 0E DC: ------------------- 10 13: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 14: 00 03: 00 00 00 01: 00 00 00 01: ------------------- 10 15:ホワイトバランス 00 03: 00 00 00 02: 00 01 00 00:前2byte → 1=AUTO / 2=プリセット / 3=ワンタッチ,後2byte → 2:3000K / 3:3700K / 4:4000K / 5:4500K / 6:5500K / 7:6500K / 8:7500K ------------------- 10 16: 00 03: 00 00 00 01: 00 00 01 98: ------------------- 10 17: 00 03: 00 00 00 02: 01 98 00 40: ------------------- 10 18: 00 03: 00 00 00 02: 01 56 00 40: ------------------- 10 19: 00 03: 00 00 00 01: 00 00 32 30: ------------------- 10 1A: 00 02: 00 00 00 20: 00 00 0E 70: ------------------- 10 1B: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 1C: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 1D: 00 04: 00 00 00 01: 00 00 00 1C: ------------------- 10 1E: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 1F: 00 04: 00 00 00 01: 01 53 58 53: ------------------- 10 20: 00 04: 00 00 00 01: 02 0A 48 5C: ------------------- 10 21: 00 04: 00 00 00 01: 00 00 11 95: ------------------- 10 22: 00 04: 00 00 00 01: 00 00 02 8D: ------------------- 10 23:フラッシュ発光量補正 00 0A: 00 00 00 01: 00 00 0E B0: ------------------- 10 24: 00 03: 00 00 00 01: 00 2E 00 00: ------------------- 10 25: 00 0A: 00 00 00 01: 00 00 0E BC: ------------------- 10 26: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 27: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 28: 00 03: 00 00 00 01: 00 00 01 4E: ------------------- 10 29:コントラスト 00 03: 00 00 00 01: 00 01 01 60:0=Normal,1=Hard,2=Soft ------------------- 10 2A: 00 03: 00 00 00 01: 01 60 00 18: ------------------- 10 2B: 00 03: 00 00 00 06: 00 00 0E E8: ------------------- 10 2C: 00 03: 00 00 00 02: 00 0A 00 00: ------------------- 10 2D: 00 03: 00 00 00 01: 09 00 00 00: ------------------- 10 2E:画像幅 00 04: 00 00 00 01: 00 00 0A 0C:2572 (pixels) ------------------- 10 2F:画像高 00 04: 00 00 00 01: 00 00 07 80:1920 (pixels) ------------------- 10 30: 00 03: 00 00 00 01: 00 04 00 00: ------------------- 10 31: 00 04: 00 00 00 08: 00 00 0F 08: ------------------- 10 32: 00 03: 00 00 00 01: FF FF 00 00: ------------------- 10 33: 00 04: 00 00 02 D0: 00 00 0F 34: ------------------- 10 34:圧縮率 00 05: 00 00 00 01: 00 00 0F 2C:オフセット 0x0F2C で目標地点は 0x0F38.値は 0x 00000008 00000001 より省略して 0x 08 01.これの逆数をとって 1/8 より圧縮率は 1/8 ------------------- 10 35: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 36: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 37: 00 04: 00 00 00 01: 00 00 00 00: ------------------- 10 38: 00 03: 00 00 00 01: 00 04 00 00: ------------------- 10 39: 00 03: 00 00 00 01: 00 00 00 00: ------------------- 10 3A: 00 03: 00 00 00 01: 00 00 01 3B: ------------------- 10 3B: 00 03: 00 00 00 01: 01 3B 02 00: ------------------- 10 3C: 00 03: 00 00 00 01: 02 00 00 00: ------------------- 00 00: 00 00: 00 00 00 00: 00 00 00 00: ------------------- 07 D1: