« SPP で現像したままの JPEG ファイルに仕込まれている Exif データ 2015/08/24 | トップページ | SIGMA Exif Reader 進捗状況 2015/08/27 »

JPEG ファイルの構造 2015/08/25

さて、昨日の続きである。ファイル内部に書かれているデータの解説をするために昨日と同じ画像を掲載させて頂く。


昨日は JPEG ファイルの構造(ファイルフォーマット)で決められているマーカから2つを紹介した。ファイルの先頭に書かれている FF D8 と Exif が使う領域の先頭を表す FF E1 である。ちなみに、 JPEG ファイル内のデータで FF で始まるモノは FF 00 以外は全てマーカ(何かの意味を持つ符号)である。

上のファイルには無いが Photoshop が作る JPEG ファイルには先頭の FF D8 の次に FF E0(APP0/JFIF)マーカがあったりする。CIPA の画像ファイルフォーマット規格では JPEG ファイルが Exif 情報を含む場合には FF D8 の次に FF E1 がなければならないと書いてあるが、Photoshop はデジタルカメラではないので、その規格に従っていないのかも知れない。

話を進めよう。

13 バイト目から16 バイト目までの4バイトが 49 49 2A 00 となっている。文字で表すと II*_ である。この 49 49 は複数バイトの数値がデータとして書き込まれる場合は小さい桁を先頭にして書き込まれています。と言う意味を持つ。おそらく Intel の I を2つ並べたのだろう。49 49 2A 00 でなければ 4D 4D 00 2A になっているはずである。4D は文字に直すと M である。ここが MM_* になっている場合は、書き込まれている複数バイトの数値が大きい桁を先頭にして書き込まれていることを意味する。ちなみに、この M はモトローラの M であると言われている。

専門的な表現では II をリトルエンディアン、MM をビッグエンディアンと言う。コンピュータ内部でデータがどの様に記録されるかに興味がなければ、ここから先の記事は全然面白くないので、読み飛ばして頂いて構わない。が、ファイルの構造解析やデータの解析を行うためには必要な知識なので、興味のある方はお付き合い願いたい。

コンピュータメモリの最小単位は「ビット(Bit)」である。が、1ビットでは、0 か 1、ON か OFF、有るか無いかしか表現出来ないので、数値や文字を記録するのには、まるで役に立たない。そこでビットを8個並べて一つのまとまりとして扱う。これを「バイト(Byte)」と呼ぶ。

1ビットが8個並ぶと、00000000 から 11111111 までの表現が可能になる。数値の 1 は 00000001 となり、数値の 8 は 00001000 となる。つまり 0 から 255 までの数値を表すことが出来るし、それぞれに意味を持たせればアルファベットや記号などを割り当てる事が出来る。

ただ、0 と 1 だけで表現した数値は、人間が見た時に今ひとつ判りにくい。そこで8個の 1 と 0 を4個ずつに分けて、0 から 9、及び A から F までの文字で表すことにした。

01011010 だと 5A となる。これが 16 進数である。16 進数を 10 進数(私たちが日常使っている数値)に直すには、上の桁に 16 を掛けて、下の桁を足せば良い。ただし、A ~ F までは 10 進数の 10 ~ 15 である。

さて、16 進法だと、1バイトは 00 から FF で表せる。0 から 255 までの数値であれば、1バイトで用は足りる。2バイト使うと 256 x 256 = 65536-1 で 0 から 65,537 まで、3バイトを使うと 0 ~ 16,777,215、4バイトでは 0 ~ 4,294,967,295 となる。マイナス値を考慮すると、一番先頭のビットが 1 ならばマイナス値と決めておけば、それぞれ半分の値まで表現出来る。

フルカラー 24 ビットが表せる色数は 16,777,216 色である事は皆さんご存じだろう。RGB のそれぞれが 0 から 255 までの値となる事で、16,777,216 色が表現出来るのである。真っ黒は 0x000000 で真っ白は 0xFFFFFF である。先頭に 0x が付くと、その後に付く文字の並びが 16 進数である事を意味する。BASIC と言うコンピュータ言語では &H000000、&HFFFFFF と書く。

さて、Exif のデータが書かれている位置やその内容を数値で表す場合、JPEG ファイルの中で使う値は最大で4バイト、つまり 0 ~ 4,294,967,295 までとなっている。16 進数で表現すると 0x00000000 から 0xFFFFFFFF までである。

で、皆さんは足し算やかけ算を筆算で計算するときには必ず一番下の1の位から計算を始めるはずだ。桁上がりを考慮するとそうせざるを得ない。コンピュータも同じである。ただ、コンピュータの場合だと、この足し算は何桁の足し算なのかが事前に解っていないと与えられた数値のバイト数を調べて、一番最後のバイトから計算を始める。

もし、全ての数字が小さい桁の順で書かれていたら、常に先頭にある値から計算を始める事が出来る。そんなわけで、コンピュータが単純な数値を複数バイトで記憶する場合、必ずしも桁の大きい方が前に来るとは限らない。一般的にはインテル系のコンピュータでは小さい方の桁が先に記録されて、大きい桁がその後に続く。

2バイトを使って 10 進数 42(0x2A)をメモリ上に記録するときに 2A 00 となるのが II で始まるリトルエンディアン、00 2A と書き込むのがビッグエンディアンである。人間にとってはビッグエンディアンであるほうが解りやすいが、Windwos などではリトルエンディアンで記録されている事が多い。

ちなみに、SPP 6 が出力してくる JPEG は先頭から 13、14 バイト目が 0x49 0x49 なのでリトルエンディアンである。

ようやく JPEG ファイルの1行目(16 バイト)の解説が終わった。この調子で説明を続けると、Exif 情報の読み出し方を解説するのに、あと一週間ほど掛かりそう・・・。(^^;

|

« SPP で現像したままの JPEG ファイルに仕込まれている Exif データ 2015/08/24 | トップページ | SIGMA Exif Reader 進捗状況 2015/08/27 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« SPP で現像したままの JPEG ファイルに仕込まれている Exif データ 2015/08/24 | トップページ | SIGMA Exif Reader 進捗状況 2015/08/27 »