Exif ファイルの覗き方 OM SYSTEM OM-1 の JPEG
バイナリーエディターを使って画像ファイルを覗いてみた。
サンプルファイルは、OM SYTEM OM-1 で撮影した Raw データを、OM Workspace を使って JPEG に書き出したもの。
OM-1 は GPS を搭載していないが、スマホのアプリを使って位置情報を転送したので、データには GPS 情報を含む。
OM-D E-M1X とは違いが見られた。
ファイル名および撮影情報
20230918_144439_P9183870.jpg, 2023-09-18 14:44:39, OM-1, LEICA DG ELMARIT 200/F2.8+TC2.0, F8.0, 1/400sec, ISO3200
記載したデータについて
文中に画像として貼り付けた罫線のない表がデータの説明である。
左端:アドレス(10進表記)
中央:データ(16進表記)
右端:簡単な説明
表のデータ部のうち、IFD のデータエントリー(12バイト)については、次のように4つに区切って表示した。
1111 2222 33333333 44444444
タグ(2バイト)
タイプ(2バイト)
データの個数(4バイト)
データまたはデータへのオフセット(4バイト)
一塊のIFDの構成はつぎのとおり
先頭の2バイト:エントリーの個数
続くデータ:個数分のデータエントリー(1個あたり12バイト)
最後の4バイト:データの終端または継続データへのオフセット
ヘッダー部
ファイルの先頭が、SOI、ファイルの始まりを示すマーカーである。
APP1 セグメントがそれに続く
圧縮ファイルにあると思われる APP0セグメントマーカーはなかった。
アドレス 12 に 4949 とあり、リトルエンディアンで書かれていることを示している。このアドレス 12 が、Exif 関連のオフセットの基準位置である。
プライマリーエントリー
アドレス 16 に最初のデータへのオフセット 08000000 が書かれている。ビッグエンディアンに直すと 00000008 である。10進数表記にすると 8。
この 8 は基準位置からのオフセットである。
基準のアドレス 12 から 8 バイトオフセットしたところ 20 が最初の IFD の先頭である。
データの最後に 60540000 とあったので、データがまだあると思い、オフセット先を読みに行った。が、そこには意味のわからないデータが書かれていた。
アドレス 190 のタグが、2588、ビッグエンディアンに直すと 8825 である。これは GPS IFD へのポインターを表すのだが、調べた限りでは、8825 より後(数字が大きな)のタグは互換性 IFD へのポインター(A005.H)くらいと思われた。
よって、8825 か、A005 がある場合には A005 をエントリーの最後とみなして良いと思われる。
Exif IFD
プライマリーエントリーの、6987(ビッグエンディアンで 8769)が Exif IFD へのポインターである。
データは、c4010000。ビッグエンディアンに直すと、000001c4、10進表記では、452。基準位置が 12 なので、Exif IFD の始まりは、12 + 452 = 464 である。
GPS IFD
プライマリーエントリーの、2588(ビッグエンディアンで 8825)が GPS IFD へのポインターである。
データは、c2530000。ビッグエンディアンに直すと、000053c2、10進表記では、21442。基準位置が 12 なので、12 + 21442 = 21454 が GPS IFD の先頭である。
MakerNote IFD
Exif IFD の 7c92(アドレス 694)がメーカーノートへのポインターである。オフセットは 36040000(ビッエンディアン 00000436)、10進表記は 1078。12+1078 = 1090 がメーカーノートの先頭である。
Equipment IFD in MakerNote
メーカーノート内のタグ 1020(ビッグエンディアン 2010、アドレス 1132)は、Equipment IFD へのポインターである。a2000000 はビッグエンディアンで a2、10進表記は 162。
このファイルの場合、メーカーノートの基準位置はバイトオーダーの位置ではなく、メーカーノートIFDの先頭である。よって、1090 + 162 = 1252 が Equipment IFD の先頭となる。
CamSettings IFD in MakerNote
メーカーノート内のタグ 2020(ビッグエンディアン 2020、アドレス 1144)は、CamSettings IFD へのポインターである。fa020000 はビッグエンディアンで2fa、10進表記は 762。
よって、1090 + 762 = 1852 が CamSettings IFD の先頭となる。
FocusInfo IFD in MakerNote
メーカーノート内のタグ 5020(ビッグエンディアン 2050、アドレス 1192)は、FocusInfo IFD へのポインターである。6c260000 はビッグエンディアンで 266c、10進表記は 9836。
よって、1090 + 9836 = 10926 が FocusInfo IFD の先頭となる。
データまたはデータへのオフセットということ
1個の IFD エントリーのサイズは 12バイト。その最後の 4バイトには、データかデータへのオフセットのどちらかが書かれている。データが 4バイトに収まらない場合には、オフセットが書かれているのである。
データのタイプ別に、データ1個あたりのサイズ(バイト)が決まっている。遠tリーには、データの個数が描かれているので、サイズ×個数で、トータルのデータサイズがわかる。それが4バイトを超える場合、データは別な場所に書かれ、4バイトには、オフセットが書かれるわけである。
オフセットが書かれている場合には、基準の位置からオフセットした場所にデータを読みにいく必要がある。
参考
デジタルスチルカメラ用画像ファイルフォーマット規格 Exif 2.3
https://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf
Exif について大部理解が進んだと思うので、記事にまとめた。
まだまだ間違って解釈しているところがあるかもしれない。
t.koba
SOI ファイルの始まり
FFD8 SOI、ファイルの始まり
アプリケーション・マーカセグメント APP0 の構造
FFE0 APP0 マーカー
0010 APP0 Length、2バイト
4A464946 00 JFIF+NULL文字、5バイト
0101 JFIF のバージョン、2バイト
01 解像度単位、1バイト
015E 横解像度、2バイト
015E 縦解像度、2バイト
00 サムネイル横サイズ、1バイト
00 サムネイル縦サイズ、1バイト
# サムネイル画像、ビットマップ、データ1個にRGBの値が書かれている。内訳は未調査。
アプリケーション・マーカセグメント APP1 の構造
# 必要に応じて APP2(複数個連続)
FFE1 APP1 Marker、2バイト
02C6 APP1 Length、2バイト
45786966 0000 Exif 識別コード、6バイト、Exif+NULL文字
# TIFF Header
4D4D バイトオーダー、ビッグエンディアンだった。
002A 固定値 0x002A
00000008 0th IFD へのオフセット 4バイト
# 0th IFD
000D 13個、データの個数
010E0002 00000001 00000000 1個目のデータ、画像タイトル
010F0002 00000015 000000AA 画像入力機器のメーカ名
01100002 00000005 000000C0 画像入力機器のモデル名
01120003 00000001 00010000 画像方向
011A0005 00000001 000000C6 画像の幅の解像度
011B0005 00000001 000000CE 画像の高さの解像度
01280003 00000001 00020000 画像の幅と高さの解像度の単位
01310002 00000012 000000D6 ソフトウェア
01320002 00000014 000000E8 ファイル変更日時
013B0002 00000001 00000000 アーティスト
82980002 00000001 00000000 撮影著作権者/編集著作権者
87690004 00000001 000000FC Exif IFD へのポインタ
88250004 00000001 000002AC 13th、GPS IFD へのポインタ
00000000 データ終わり、継続なし
8769 は Exif IFD ポインター
8825 は GPS IFD ポインター
Exif IFDへアクセス
Exif IFD へのポインター
2バイト2バイト4バイト4バイトに分割する
8769 0004 00000001 000000FC
ビッグエンディアンなので、そのまま読める。
8769 タグコード
0004 データタイプ
00000001 データの個数
000000FC データまたはデータへのオフセット
データタイプは 4。unsigned long, 4 bytes
0xFC を10進数にすると 252。
このオフセットは基準となる位置からのオフセットである。基準位置は、Exif 識別コードの次、バイトオーダーの位置。サンプルファイルの場合は、30 である。
30 + 252 = 282 の位置を見てみる。
001C 28個、データの個数
829A0005 00000001 00000252 露出時間
829D0005 00000001 0000025A F ナンバー
88220003 00000001 00010000 露出プログラム
88270003 00000001 32000000 撮影感度
88300003 00000001 00010000 感度種別
88310004 00000001 00003200 標準出力感度
90000007 00000004 30323331 Exif バージョン
90030002 00000014 00000262 原画像データの生成日時
9204000A 00000001 00000276 露光補正値
92050005 00000001 0000027E レンズ最小F値
92070003 00000001 00050000 測光方式
92080003 00000001 00090000 光源
92090003 00000001 00100000 フラッシュ
920A0005 00000001 00000286 レンズ焦点距離
92860007 00000008 0000028E ユーザーコメント
A0010003 00000001 FFFF0000 色空間情報
A0020003 00000001 14400000 実効画像幅
A0030003 00000001 0F300000 実効画像高
A3000007 00000001 03000000 ファイルソース
A4020003 00000001 00010000 露出モード
A4030003 00000001 00010000 ホワイトバランス
A4040005 00000001 00000296 デジタルズーム倍率
A4060003 00000001 00000000 撮影シーンタイプ
A4070003 00000001 00020000 ゲイン制御
A4080003 00000001 00000000 撮影コントラスト
A4090003 00000001 00000000 撮影彩度
A40A0003 00000001 00000000 撮影シャープネス
A4340002 0000000D 0000029E 28th、レンズのモデル名
00000000 データ終わり、継続なし
参考資料
デジタルスチルカメラ用画像ファイルフォーマット規格 Exif 2.3
https://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf
t.koba