Exifファイル(1回目) ~ ファイル概要 ~

 多くのデジタルカメラ(デジカメ)の画像保存形式はExifという情報を含んでいる。

 Exif情報を含んだファイル(Exifファイル)には
   ・撮影に使用したデジカメ名のメーカー名
   ・撮影日時
   ・撮影時のシャッター速度や絞り値
   ・デジカメの撮影モード
など数多くの情報が保存されている。

 Exifに関する情報はJpegファイル中にTIFFと同様の形式で格納されている。



 ・JPEGファイル格納形式 

   jpegファイルはFF xxという2バイトのマーカーと次のマーカーまでのバイト数を
  2バイトという計4バイトの組み合わせで画像情報を格納する領域を指定し保存して
  いる。

  0000: FF D8 FF xx 00 0C 00 00 00 00 00 00 00 00 00 00
        ①    ②    ③    ④
  0010: FF xx .....
        ⑤

          ① SOI マーカー
          ② 1つ目のマーカー
          ③ 次のマーカーまでのバイト数 0x000C = 12バイト
                ※ 実際のデータサイズ+2バイトとなる
          ④ 1つ目の情報
          ⑤ 2つ目のマーカー
   ここで④に対応するデータ部分にExif情報や画像情報が格納される。
   Exif情報はTIFFと同様の形式で格納されている。
 

 ・Exif情報の格納形式 

  0000: 01 0F 00 02 00 00 00 03 00 00 00 18 01 12 00 05 
        ①    ②    ③          ④          ⑤    ⑥
  0010: 00 00 00 01 00 01 00 00 6A 6B 6C 6D 00
        ⑦          ⑧          ⑨
          ① 1つ目のタグ
          ② 1つ目の格納値タイプ
          ③ 1つ目の格納値数
          ④ 1つ目のオフセットもしくは格納値
                ここではオフセットとして使用
          ⑤ 2つ目のタグ
          ⑥ 2つ目の格納値タイプ
          ⑦ 2つ目の格納値数
          ⑧ 2つ目のオフセットもしくは格納値
                ここでは値として使用
          ⑨ 1つ目の格納値
                1つ目のオフセット値0x18に対応するアドレスから情報が格納される
   このように〝タグ〟として格納されている。



 実際のExif情報をファイルの先頭から見ると以下のようになる(各情報の詳細は次回以降)。


0000: FF D8 FF E1 3D 6A 45 78 69 66 00 00 4D 4D 00 2A
      ①    ②    ③    ④                ⑤    ⑥
        ① SOI マーカー
        ② APP1 マーカー
        ③ APP1 サイズ
        ④ Exifマーカー ('Exif\0\0')
        ⑤ 数値格納形式
             49 49('II') : インテル形式
             4D 4D('MM') : モトローラ形式
        ⑥ TAGマーカー

0010: 00 00 00 08 00 0B 01 0F 00 02 00 00 00 09 00 00 
      ①          ②    ③    ④    ⑤          ⑥
        ① 1番目のディレクトリへのオフセット
        ② ディレクトリ・エントリ数

          【 1番目のディレクトリの開始 】
        ③ ディレクトリ・タグ
        ④ 格納値タイプ
                1 : BYTE       (8bit unsigned integer)
                2 : ASCII      (NULLで終わる文字列)
                3 : SHORT      (16bit unsigned integer)
                4 : LONG       (32bit unsigned integer)
                5 : RATIONAL   (2つのLONGの比; unsigned double)
                6 : 未定義
                7 : Undefined  (8bit値)
                8 : 未定義
                9 : SLONG      (32bit signed integer)
               10 : SRATIONAL  (2つのSLONGの比; signed double)
        ⑤ 格納値数
        ⑥ オフセットもしくは格納値
          【 1番目のディレクトリの終了 】

0020: 00 92 01 10 00 02 00 00 00 0D 00 00 00 9C 01 12 
            2番目                               3番目
0030: 00 03 00 00 00 01 00 01 00 00 01 1A 00 05 00 00 
                                    4番目
0040: 00 01 00 00 00 AA 01 1B 00 05 00 00 00 01 00 00 
                        5番目のIFD
0050: 00 B2 01 28 00 03 00 00 00 01 00 02 00 00 01 31 
            6番目                               7番目
0060: 00 02 00 00 00 24 00 00 00 BA 01 32 00 02 00 00 
                                    8番目
0070: 00 14 00 00 00 DE 02 13 00 03 00 00 00 01 00 02 
                        9番目のIFD
0080: 00 00 82 98 00 02 00 00 00 0B 00 00 00 F2 87 69 
            10番目                              11番目
0090: 00 04 00 00 00 01 00 00 00 FE 00 00 03 8C 46 55 
                                    ①          ②
00A0: 4A 49 46 49 4C 4D 00 00 46 69 6E 65 50 69 78 53

        ① 次のIFDへのオフセット???????????
        ② 1番目のディレクトリが示すデータ

00B0: 31 50 72 6F 00 00 00 00 00 48 00 00 00 01 00 00
00C0: ..............


カテゴリー「VC++ TIPS」 のエントリー