Chapter Seven

第7話



ハッピー ニューイヤー!

前回は少し長すぎたようだが、今日は手短にTIFFファイルの仕組みを書いておこう。詳しく知っている人も間違い探しをするつもりで読んでくれ。なにしろ、色々な用途に使えるようにかなり回りくどいフォーマットだから分かりにくくてオレは最低限度の理解しかしていないだろうと思う。
いっぱいあるフォーマットの中でなんでTIFFなんだ? と、疑問になる人もいるだろうが、TIFFはプラットフォームを越えて使われているフォーマットで、24bitカラーを含め適用範囲が広い。GIFもプラットフォームを選ばない点で候補には挙がるが、256色までしか扱えないこととデータ圧縮を理解する必要があるのでやめにした。
TIFFファイルはヘッダーと画像形式などを記録したIFD(イメージファイルディレクトリ)と画像データから構成されているが、ファイルの中で位置が固定しているのはヘッダーだけで画像データを手にするためにはファイルの中を芋づる式に手繰っていく必要がある。ファイルの中でオリエンテーリングをしているようなもんだな。
まず、ヘッダーを見てみよう。これは8バイト長で、2バイトのバイトオーダー記号とバージョン番号、4バイトのIFDオフセットでできている。グラフィックソフトを使っていてTIFF形式で保存するときに、下の図のようにMotorolaタイプかIntelタイプかの選択をせまられるが、これはバイトオーダーを選択しているのだ。Intelを選ぶと下位から上位の順序で保存される。

Fig. 1



それぞれのバイトオーダーで記録されたファイルのヘッダー部分をU16で4個読みとって16進で表示すると下の図のようになる。Motorolaタイプでは4D4D h (ASCIIではMM)、Intelタイプでは4949 h (ASCIIではII)と記録される。

Fig. 2



次のバージョン番号は常に2A h (10進数で42)だ。最後の4バイトがIFDへのポインタを示している。LabVIEWでファイルの読み書きをしている限りIntelタイプは頭痛の種になるだけなので、あっさり諦めることにした。Intelタイプをどうしても読みたいときには他のソフトでコンバートする必要がある。
IFDの構造は、2バイトのエントリ数と各12バイトのIFDエントリからなる。すべてのエントリの後に次のIFDへの4バイトのポインタがある。最後のIFDの場合は、4バイト全てを0にする。IFDエントリの内訳は2バイトのタグ、2バイトのデータタイプ、4バイトのカウント、4バイトのポインタ/データフィールドからなる。U16で読みとると下の図のように記録されている。これだけでは何のことかさっぱり分からない。

Fig. 3



基本的なタグに関する約束事をまとめると以下のようになる。ポインタ/データフィールドは4バイトでデータがおさまる場合はデータを書き込んでしまうが、データが2バイト長しかない場合は前半の2バイトにデータを入れる。4バイトよりデータが多い場合は、データの格納場所のオフセット値を書き込む。オフセットは全てファイルの先頭からのオフセット値を使うことになっているからLabVIEWでプログラミングしやすい。

Fig. 4



タグ262のPhotometricInterp.のデータは0、1の時は白黒を示し、2の時はRGB、3の時は256カラーを示す。今回は1個の輝度グラフでの入出力に狙いを絞ったのでRGBはサポートしないことにした。したがってタグ277のSamplesPerPixelは1の場合だけ有効になる。タグ258のBitsPerSampleは8以外の1、2、4も可能ではあったが、データの切り出しに時間がかかることとあまり必要性がないことから8のみ有効とした。
肝心のデータのオフセット値はタグ273のStripOffsetsから得られる。TIFFでは複数の領域に分割して帯状にデータを記録した場合(カウントがn)それぞれのデータのオフセットを格納した領域へのオフセット値をタグに記入する。分割しない場合(カウントが1)はタグに記入されたオフセット値がデータのオフセット値になる。

ここまでの説明でTIFFファイルの中で、IFDとカラーマップと画像データの配置に関する制約は無いことが分かったと思う。同じ画像データ(100*100バイト)を手持ちのアプリケーションで保存してそれぞれの配置を調べてオフセット値を表にしてみた。好き勝手に並べている雰囲気があるな。

Fig. 5



だいたいこんなところでTIFFの説明は終わりだ。VIのダイアグラムを見て何をしているか分かる程度には説明したつもりだ。なかなか簡潔に書けたよな。もっと詳しく知りたい場合はすこし値段が高いが、(株)アスキーから出ている「グラフィックファイルフォーマットハンドブック」を参考にすると良いと思う。手に入りにくいとは思うが、O'Reilly & Associates, Inc.の「Encyclopedia of Graphics File Formats」も参考になる。勿論、Aldus(Adobeに買収されたんだっけ?)から仕様を取り寄せることも可能だろう。
次回はTiffRd.viとTiffSv.viの使用方法について書くつもりだが、特に興味のある人は大橋宛(ohashi@mac.email.ne.jp)にメールで申し込んでおくと良いと思う。
Let's enjoy vi programing!

Fig. 6
LabVIEWで計算し、TiffSv.viで保存したマンデルブロー集合



See you!

Nigel Yamaguchi


戻る