TIFFのフォーマット(その2)

 前回の記事でTIFFのフォーマットの大筋を解説しました。

「TIFFのフォーマット(その1)」

TIFFとは付加情報と画像情報がセットになった画像フォーマットであることを学びました。今回はやりのこしのタグの種類について解説していきます。解説の際に以下のサンプルTIFF画像を仕様します。

TIFFのサンプル画像

バイナリエディタで見ながら進めるといいでしょう。

必須タグ

タグには記述が必須のものと、つけなくてもいいものがあります。はじめに必ず記述する必要がある必須タグを紹介します。必須タグ以外の選択タグは次回解説します。基本的に必須タグは記述しなければいけません。しかし、プログラムによっては、必ずしもすべての必須タグを記述しなくてもいいようです。実際にサンプルのTIFFファイルは一部の必須タグの記載がありません。

タグ番号 名前 意味 デフォルト値
01 00h ImageWidth 画像の幅 なし
01 01h ImageLength 画像の高さ なし
01 02h BitsPerSample 色の深さ 1
01 03h Compression 画像の圧縮方法 1
01 06h PhotometricInterpretation  画素データの最大値・最小値の設定 なし
01 11h StripOffsets ストリップ(画素データの切れ端)の開始位置 なし
01 16h RowsPerStrip ストリップに含まれる行数 232-1
01 17h StripByteCounts ストリップのバイト数 なし
01 1Ah XResolusion 幅方向の解像度 なし
01 1Bh YResolusion 高さ方向の解像度 なし
01 28h ResolusionUnit 解像度における単位の設定 2 (inch)
01 40h ColorMap カラーマップ表示を選択した際のカラーマップの設定 なし

1. ImageWidth

画像の幅です。画像のピクセル数を表記します。

  1. タグ番号:01 00
  2. データの型:SHORTまたはLONG
  3. データサイズ:1
  4. データ値:画像の幅のピクセル数を記載

2. ImageLength

画像の高さです。画像のピクセル数を表記します。

  1. タグ番号:01 01
  2. データの型:SHORTまたはLONG
  3. データサイズ:1
  4. データ値:画像の高さのピクセル数を記載

3. BitsPerSample

色の深さをあらわします。

  1. タグ番号:0102
  2. データの型:SHORT(2バイト)
  3. データサイズ:グレースケールの場合1、RGBなら3
  4. データ値:色の深さ

データ値はデータサイズに依存してデータ値でなくデータの位置を指定することがあります。例えば、グレースケールで255の色の深さならデータ値は「00 08」となります。2バイトは余ります。一方、RGBですべて255の深さなら、「00 08 00 08 00 08」となり4バイトを超えます。この場合は、「08 08 08」を別の場所に記憶しておき、その位置をデータ値に記述します。

サンプル画像の場合は

01 02 | 00 03 | 00 00 00 03 | 00 00 00 86

となっており、SHORTが3つで4バイトを超えるので位置「86」を記載しています。位置「86」を見ると

00 08 00 08 00 08

となり確かに255の色の深さをRGBに指定していることがわかります。

4. Compression

データの圧縮方法。省略すると1になります。

  1. タグ番号:01 03
  2. データの型:SHORT
  3. データサイズ:1
  4. データ値:1-6,32773

データ値は以下の圧縮法で設定します。

  • 1: 非圧縮
  • 2: ITU-T
  • 3: ファクシミリ互換のITU-T Group 3
  • 4: ファクシミリ互換のITU-T Group 4
  • 5: 固定長コードLZW圧縮
  • 6: JPEG
  • 7: JPEG圧縮-2
  • 8: ZIP圧縮
  • 32773: Packbits圧縮

サンプルをみてみると記載がないので、デフォルト値1をとり非圧縮だとわかります。

5. PhotometricInterpretation

画素データの最大値や最小値の設定です。

  1. タグ番号:01 06
  2. データの型:SHORT
  3. データサイズ:1
  4. データ値:コード0-4

データ値は上位2バイトが読まれ、下位2バイト「00 00」は無視します。コードは以下の様な意味です。

  • 0: 黒モードモノクロ(白=0、黒=2BitsPerSample-1)
  • 1: 白モードモノクロ(白=2BitsPerSample-1、黒=0)
  • 2: RGBダイレクトカラー(最小値=0、最大値=2BitsPerSample-1)
  • 3: カラーマップ(カラーマップ数=2BitsPerSample
  • 4: 論理マスク

サンプルTIFFの場合

01 06 | 00 03 | 00 00 00 01 | 00 02 00 00

で「00 02」なので、RGBダイレクトカラーに設定されています。下位バイト「00 00」は無視します。

6. StripOffsets

 画素データはいくつかに分けて保管されています。 この分けた固まりをストリップ(Strip)といいます。StripOffsetsにはストリップの開始位置を記載します。複数のストリップがある場合は、データ値にストリップの位置を羅列した場所を指定します。

  1. タグ番号:01 11
  2. データの型:SHORTまたはLONG
  3. データサイズ:ストリップの個数
  4. データ値:ストリップの開始位置(ストリップが複数の場合は、ストリップの開始位置がかかれた位置がかかれる)

サンプルのTIFFでは

01 11 | 00 04 | 00 00 00 01 | 00 00 00 9A

とありストリップは1つです。そして、「9A」がストリップの開始位置になります。「9A」から画素データが開始されることになります。

7. RowsPerStrip

 一つのストリップに含まれる画像データの行数です。

  1. タグ番号:01 16
  2. データの型:SHORTまたはLONG
  3. データサイズ:1
  4. データ値:ストリップの行数

サンプルのTIFFの場合

01 16 | 00 03 | 00 00 00 01 | 00 96 00 00

とあるのですべての行(96は10進数で150)がひとつのストリップに含まれることになります。ストリップがひとつしかないので当たり前ですが。

8. StripByteCounts

 ストリップに含まれる画素データのバイト数をあらわします。ストリップが複数ある場合は、ストリップのバイト数を羅列した位置をデータ値に指定します。

  1. タグ番号:01 17
  2. データの型:SHORTまたはLONG
  3. データサイズ:ストリップの個数
  4. データ値:ストリップのデータバイト数

サンプルのTIFFでは

01 17 | 00 04 | 00 00 00 01 | 00 01 07 AC

となっており、ひとつのストリップに「107AC=67500個」のバイト数のデータがあることになります。この画像データは

 150\times 150\times 3=67500

なのでひとつのストリップにすべての画素データが入っていることがわかります。

9. XResolusion

幅方向の解像度です。測定単位は後に記載するResolutionUnitで決定します。

  1. タグ番号:01 1A
  2. データの型:RATIONAL
  3. データサイズ:1
  4. データ値:画像幅方向の解像度(ピクセル/測定単位)

10. YResolusion

高さ方向の解像度です。測定単位は後に記載するResolutionUnitで決定します。

  1. タグ番号:01 1B
  2. データの型:RATIONAL
  3. データサイズ:1
  4. データ値:画像の高さ方向の解像度(ピクセル/測定単位)

11. ResolusionUnit

画像解像度を決める際の測定単位です。デフォルトは2になっています。

  1. タグ番号:01 28
  2. データの型:SHORT
  3. データサイズ:1
  4. データ値:1->単位は処理プログラムにまかせる、2->インチ(inch)、3->センチメートル(cm)

サンプルTIFFでは記載がないので、単位はデフォルトでインチとなります。

12. ColorMap

PhotometricInterpretationで4のカラーマップを選んだ場合に、画素に対応した色を設定します。カラーマップテーブルがない場合はゼロをデータ値に設定します。カラーマップは画素ごとにRGBの3色を設定する必要があるので、データサイズは3☓2BitsPerSampleになります。

  1. タグ番号:01 40
  2. データの型:SHORT
  3. データサイズ:3☓2BitsPerSample
  4. データ値:カラーマップテーブルの位置

データ値にはカラーマップテーブルの位置を記述します。

 

著者:安井 真人(やすい まさと)