TIFFのファイル構造

今回骨の材料試験を行うために,下の写真のように骨を樹脂で固定して試験片を作成し,CT撮影しました.そしてCT画像データを編集しやすいようにバイナリデータに変換しようとしたところ・・・

attachment00

先輩方の作られたTIFFファイルをバイナリファイルに変換するC言語ソースファイルは8bitのTIFFにしか対応していないことが判明しました.8bitでもいいかな・・・と思いましたが,8bitでは256階調,16bitでは65536階調の輝度値を表現できるという大きな差があるので,TIFFのファイル構造の勉強をかねて16bitのTIFFに対応したバイナリファイル変換ソフト(C言語)を作成しようと思いました.

でもこれば結構難しい・・・

TIFFファイルをtextエディタのバイナリモードで開いてみました.(stirlingというフリーソフトで開くととてもわかりやすいです!!←おすすめです)

すると数字の羅列(16進数表記)を確認することができます.

その数字の上8バイトはImage FIile Header(IFH)と呼ばれるものです.
IFHの上2バイトは4D 4Dまたは4949となっており,4D4Dの場合はビッグエンディアン,4949の場合はリトルエンディアンであることを示しています.
次の2バイトは002A(ビッグエンディアンの場合)または,2A00(リトルエンディアンの場合)となっており,これはTIFFファイルであることを示しています.
最後の4バイトはImage File Directory(IFD)の位置を示してくれています.(エンディアン変換についてはまた調べてみてください!!)

今回私が開いたTIFFファイルの場合のIFHは

4D 4D 00 2A 00 08 02 08

となっており,これを解読すると,ビッグエンディアンのTIFFファイルで512バイト目からIFDが格納されていることを示しています.

そのあとから512バイト目までは輝度値が格納されています.

それ以降はIFDが格納されており,

IFDの先頭の2バイトはタグの長さを示しており,私の場合 00 0B となっています.これは11個のタグが存在していることを示しています.

その次からはTag ID(2バイト),Data Tayp(2バイト),Data Count(4バイト),Data Offeset(4バイト)が収められています.

つまり今回は(Tag ID,Data Tayp,Data Count,Data Offeset)×11個存在しているということになります.

そしてこの部分には,画像サイズ,データ型などが格納されています.

今回特に大切だったのは画像サイズです.

tagID 01 00 には縦の画像サイズ,01 01には横の画像サイズ情報がData Offsetの上2バイトに格納されています.

私の場合両方 02 00 なので縦サイズ512×512の画像サイズであることがわかります.

 

ようやくここまで理解できた(;^_^A

TIFFファイルを単純なバイナリデータに変換するにはヘッダファイル以降の輝度情報を読み込み,書き出していけばできるようです.

画像ファイルを操れるようになるとちょっと面白そうですね!!

また勉強してみようと思います!!

さて,これからC言語ソースファイルを作成します.

 

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>