1996/10/26-11/2: Exif file format

$Id: exif.html,v 1.20 1999/01/09 17:30:31 itojun Exp $
To readers: This page tries to understand Exif graphic format to some extent. This page is NOT a complete specification in nature. Also, this page is incomplete and obsolete; the page only describes very few part of Exif version 1, and there's Exif version 2 exist. I do not plan to expand this page, and I will not be providing English page.

If you need a complete documentation, you should contact JEIDA, Japan Electronic Industry Development Association, who sells Exif specification sheet in outrageous price (they charge $60 for a document with only 103 pages). I believe it VERY stupid to make a common standard specification document proprietary.

I have no extra information nor alternate webpage. I have no English version of this webpage, I have no plan to do the translation.

To digi-cam manufacturers around the world, Exif is a good specification, but JEIDA REALLY sucks. I really do think so.


読者のみなさんへ: このページ、不完全だし話が古いです。 より詳しくは こちら参照。
ここでは、公共にavailableになっている資料をもとに、DS-7などで使われている Exifファイルのフォーマットを調べてみたい。 これなら別に問題あるまい。 ちなみに、わたしが使った「公共にavailableになってる資料」とは、 independent jpeg groupの jpegsrc.v6.tar.gzと Aldusの管理している TIFF6.ps.gzである。 ほーら、公共に手にはいるでしょ? ちなみに、グラフィックファイルフォーマットについては ここが詳しい。

ここで調査に使っているのは、DS-7から吸った640x480のExifファイルである。 他のカメラから吸った場合とか、 DS-7の320x240モードの画像だとどうなってるかとかはわからない。


全体の構造

Exifファイルは、基本的にはAPP1マーカを持ったjpegファイルである。 で、APP1データの中がExifファイルのキモである。 APP1データはちょっとしたヘッダと、若干異常なtiffファイルに分けられる。 ここでは仮に前者を「Exifヘッダ」、後者を「Exifデータ」と呼ぶことにする。

構造を書き下すと以下のようになる。 (なんかもっとわかりやすい書き方はないもんかな)
フォーマット 中身/意味
jpegファイル SOIマーカ
jpegのはじまり
APP1マーカ
Exifのはじまり
APP1データExifヘッダ 単なるマジックナンバ
Exifデータ(tiffフォーマット) 撮影日付/サムネイル
他のマーカ/データ
jpeg画像データ


jpegファイルの構造

いちばん外側の殻、jpegファイルはAPP1マーカを含んでいる。

APP1マーカがどこに来るべきか、というのはよくわからないが、 とりあえずDS-7の吐いたExifファイルの場合、 以下のようにAPP1マーカが一番最初に来ている。

00000000:  FF D8 FF E1 28 98 45 78 69 66 00 00 49 49 2A 00
           ^^^^^SOIマーカ    ^ここからAPP1データ
                 ^^^^^APP1マーカ
                       ^^^^^APP1サイズ: 10390(0x2898)bytes
00000010:  08 00 00 00 0D 00 )E 01 02 00 07 00 00 00 AA 00
...
00002880:  71 53 6D 81 69 60 6A 83 61 5B 6A 85 4C 55 70 80
00002890:  89 5A 6F 83 56 55 6D 83 4E 2E 6E 80 FF DB 00 C5
                                               ^^^^^DQTマーカ(APP1の次)
APP1マーカ/データ以外の部分は、普通のviewerで見ることのできる jpegファイルであり、そこには撮影されたフルサイズの画像が格納されている。 サイズに特別な制約があるのかどうかは、 手元にDS-7の吐いた640x480の画像しかないのでよくわからない。 しかし、この画像サイズはAPP1データの中に格納されているtiffファイルにも 記述されているので、両者がちゃんと正しく整合していないといけないのだけは 間違いない。

APP1データの構造

APP1データの中身は以下のようなフォーマットになっている。

Exifヘッダの構造

構造なんて書くほどのもんではない。

Exifデータの構造

Exifデータはtiffフォーマットのデータになっている。 細かいtiffファイルの構造については前述のとおり、 まっとうな規格書が誰でも取れる場所にあるので詳説は避ける。

DS-7から吸ったExifデータの場合、Endianはbig endian(intel)である。

このtiffファイルには、IFD(Image File Directory)がふたつある。 どうも、見ている限り前者は

を格納しており、後者はサムネイル画像を格納しているように見える。

ひとつめのIFD

ひとつめのIFDは、外の殻のjpegファイルに関する情報を握っており、 以下のようなエントリを持っている。
エントリ0: ImageDescription 270(0x10e)
文字列でメモリカード上での写真の番号。 例にとったファイルではファイル名がDSC00001.JPGで 1枚目なので、"000001\0"である。 ファイル名が5桁なのにここでは6桁。謎。
エントリ1: Make 271(0x10f)
文字列で"FUJIFILM\0"
エントリ2: Model 272(0x110)
文字列で"DS-7\0\0\0\0"。 8文字になるようパディングしている理由はよくわからない。
エントリ3: Orientation 274(0x112)
shortで1。 画像の0行めが上端、画像の0カラムめが左端であることを示す。 よーするに、座標軸がxは右へ、yは下へ延びていることを示す。
エントリ4: XResolution 282(0x11a)
分数(rational)で72(= 72/1)。
エントリ5: YResolution 283(0x11b)
分数(rational)で72(= 72/1)。
エントリ6: ResolutionUnit 296(0x128)
shortで2。 XResolutionとYResolutionはインチ単位(dpi)であることを示す。
エントリ7: WhitePoint 318(0x13e)
分数2つで[0.3127 0.3290](= [3127/10000 3290/10000])。 白のChromaticity値(日本語だとクロマ値であってる?)を示す。 TIFF version 6の推奨値は0.3127 0.3290である。 つまりそのまんま。
エントリ8: PrimaryChromaticities 319(0x13f)
分数6つで[0.64 0.64 0.64 0.64 0.64 0.64](= [640/1000 640/1000 ...])。 これもよくわからない。
エントリ9: YCbCrCoefficients 529(0x211)
分数3つで[0.299 0.299 0.299](= [299/1000 299/1000 299/1000])。 これもよくわからない。
エントリ10: YCbCrPositioning 531(0x213)
shortで2。 これ、TIFF version 6ではインデックスにしか載ってないのは気のせい?
エントリ11: ReferenceBlackWhite 532(0x214)
分数6つで[0 0 0 0 0 0](= [0/1 0/1 ...])。 意味わかりませーん。 TIFF version 6の87ページ参照。
エントリ12: Unknown 34665(0x8769)
ここがとってもクセモノだ。 tiffフォーマット的には、longで350(0x15e)っていう値なんだが、 それの意味するところが問題。 これに関しては次をみるべし。
さて、実はひとつめのIFDからふたつめのIFDまでの間には、 tiffフォーマット的にタグのつけられていない未使用領域が存在する。 未使用領域は350(0x15e)から775(0x307)までである。 ということなので、エントリ12に書かれている350(0x15e)という値は、 この未使用領域へのポインタであると考えるのが妥当だろう。

未使用領域の例を以下に示す:

	  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
	  ----------------------------------------------- ----------------
						    vここから
00000150: 00 00 01 00 00 00 ff 00 00 00 01 00 00 00 06 00 ................
00000160: 00 90 07 00 04 00 00 00 30 31 30 30 01 91 07 00 ........0100....
00000170: 04 00 00 00 01 02 03 00 02 91 05 00 01 00 00 00 ................
00000180: ac 01 00 00 01 92 05 00 01 00 00 00 b4 01 00 00 ................
00000190: 02 92 05 00 01 00 00 00 bc 01 00 00 03 90 02 00 ................
000001a0: 14 00 00 00 c4 01 00 00 00 00 00 00 02 00 00 00 ................
000001b0: 01 00 00 00 32 00 00 00 0a 00 00 00 17 00 00 00 ....2...........
000001c0: 0a 00 00 00 31 39 39 36 3a 30 38 3a 32 34 20 31 ....1996:08:24 1
000001d0: 37 3a 30 31 3a 33 34 00 11 00 00 01 04 00 01 00 7:01:34.........
000001e0: 00 00 50 00 00 00 01 01 04 00 01 00 00 00 3c 00 ..P...........<.
000001f0: 00 00 02 01 03 00 03 00 00 00 aa 02 00 00 03 01 ................
00000200: 03 00 01 00 00 00 01 00 00 00 06 01 03 00 01 00 ................
00000210: 00 00 06 00 00 00 11 01 04 00 01 00 00 00 10 03 ................
00000220: 00 00 15 01 03 00 01 00 00 00 03 00 00 00 16 01 ................
00000230: 03 00 01 00 00 00 3c 00 00 00 17 01 04 00 01 00 ......<.........
00000240: 00 00 80 25 00 00 1a 01 05 00 01 00 00 00 b0 02 ...%............
00000250: 00 00 1b 01 05 00 01 00 00 00 b8 02 00 00 1c 01 ................
00000260: 03 00 01 00 00 00 01 00 00 00 28 01 03 00 01 00 ..........(.....
00000270: 00 00 02 00 00 00 11 02 05 00 03 00 00 00 c0 02 ................
00000280: 00 00 12 02 03 00 02 00 00 00 02 00 01 00 13 02 ................
00000290: 03 00 01 00 00 00 02 00 00 00 14 02 05 00 06 00 ................
000002a0: 00 00 d8 02 00 00 00 00 00 00 08 00 08 00 08 00 ................
000002b0: 48 00 00 00 01 00 00 00 48 00 00 00 01 00 00 00 H.......H.......
000002c0: 2b 01 00 00 e8 03 00 00 4b 02 00 00 e8 03 00 00 +.......K.......
000002d0: 72 00 00 00 e8 03 00 00 00 00 00 00 01 00 00 00 r...............
000002e0: ff 00 00 00 01 00 00 00 80 00 00 00 01 00 00 00 ................
000002f0: ff 00 00 00 01 00 00 00 80 00 00 00 01 00 00 00 ................
00000300: ff 00 00 00 01 00 00 00 44 53 2d 37 00 00 00 00 ........DS-7....
			       ^ここまで
とりあえず日付が見えますね。 "0100"ってのはフォーマットのバージョン番号でしょうか。

この中をどうやってデコードするかについてははっきり言ってよくわからなーい。 どうせ可変長のフォーマットに違いないのでオフセット決め打ちはできたら避けたい。

ふたつめのIFD

ふたつめのIFDは、サムネイル画像を示すtiffフォーマットのデータである。 サンプルデータの場合、Exifデータの先頭から472(0x1d8)バイトめから 格納されていた。

80x60の画像が圧縮されずに格納されている。 画像の各ピクセルの色はYCbCrで表されているのでちょっとめんどくさいが、 ふたつめのIFDはまっとうなtiffフォーマットをしているので 安直に読み出すことができる。 xvとかでも見れる。

サムネイルを取り出しちゃうツールをつけておいたので、 ツール類の節を参照してください。


ツール類

jpegファイルから、APP1をひっぺがす

一部アプリケーションはAPP1を見ると発狂するようなので。 perl scriptを用意したので利用されたい。

jpegファイルから、APP1データだけを取り出しちゃう

perl scriptを用意したので利用されたい。

Exifヘッダ+Exifデータから、Exifデータだけを取り出す

最初6バイトを外せばいいだけなので、ツール作る必要もなく、
% dd if=hoge.app1 of=hage.tiff bs=1 skip=6
で十分である。

tiffの最後のIFDだけを有効にする

この作業を行うと、Exifデータ部のtiffファイル(わけわかんない部分+サムネイル) のうちサムネイルだけを有効にすることができる。 残念ながらわけわかんない部分を取り外していないので、 ファイルの内容にはちょっと無駄が残る。
perl scriptを用意したので利用されたい。 このperl scriptは指定したtiffファイルを上書きしちゃうので、 実験のときにはバックアップをとってからにしようね。


感想

やっぱりこの御時世にファイルフォーマットをproprietaryにしたり、 金ださないと買えないようにするのはよくないと思うぞ。 そういうことだとGraphiConverterみたいな超優秀ツールで サポートしてもらえなくてつまらないよ。 (別にFujiが内緒にしてるわけじゃないので、FujiじゃなくてJEIDAがいけないんだが)

ちょっとずれるかもしれないが、 日本の政府関連機関や社団がつくった資料は大抵有料配布で、 しかもナマでの再配布が禁じられている(例: 国土地理院の数値地図)。 税金でつくったもんを買わないといけないってのはどういうことだあ? とわたしは思う。 日本の頭カタイひとの思考回路のdefaultがそうなってるのか?


itojun hack ESD Saturday meeting Wednesday meeting Yobichosa bookshelf comics
1995: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1996: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1997: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1998: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1999: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2001: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2002: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2003: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2004: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2005: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2006: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

diary update scanner 1 2 3 4
places I frequently visit: Altavista PCWatch comics LPF bookmarks Free Mr.Kaneko! / voice your concern on manga regulation! Amazon.co.jp associate PSE法反対! [六ヶ所村問題] [software patent] [共謀法反対]
Unauthorized reproduction is strictly prohibited unless specially noted. If you have problem reading the text (KSC5601 with ctext/iso-2022-jp-2 encoding) use w3m-m17n or mozilla.
Google