見出し画像

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
  1. タグ(2バイト)

  2. タイプ(2バイト)

  3. データの個数(4バイト)

  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


いいなと思ったら応援しよう!