TIFFのフォーマット(その2)
2015年1月19日:libtiff
前回の記事でTIFFのフォーマットの大筋を解説しました。
「TIFFのフォーマット(その1)」
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
画像の幅です。画像のピクセル数を表記します。
- タグ番号:01 00
- データの型:SHORTまたはLONG
- データサイズ:1
- データ値:画像の幅のピクセル数を記載
2. ImageLength
画像の高さです。画像のピクセル数を表記します。
- タグ番号:01 01
- データの型:SHORTまたはLONG
- データサイズ:1
- データ値:画像の高さのピクセル数を記載
3. BitsPerSample
色の深さをあらわします。
- タグ番号:0102
- データの型:SHORT(2バイト)
- データサイズ:グレースケールの場合1、RGBなら3
- データ値:色の深さ
データ値はデータサイズに依存してデータ値でなくデータの位置を指定することがあります。例えば、グレースケールで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になります。
- タグ番号:01 03
- データの型:SHORT
- データサイズ:1
- データ値: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
画素データの最大値や最小値の設定です。
- タグ番号:01 06
- データの型:SHORT
- データサイズ:1
- データ値:コード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にはストリップの開始位置を記載します。複数のストリップがある場合は、データ値にストリップの位置を羅列した場所を指定します。
- タグ番号:01 11
- データの型:SHORTまたはLONG
- データサイズ:ストリップの個数
- データ値:ストリップの開始位置(ストリップが複数の場合は、ストリップの開始位置がかかれた位置がかかれる)
サンプルのTIFFでは
01 11 | 00 04 | 00 00 00 01 | 00 00 00 9A
とありストリップは1つです。そして、「9A」がストリップの開始位置になります。「9A」から画素データが開始されることになります。
7. RowsPerStrip
一つのストリップに含まれる画像データの行数です。
- タグ番号:01 16
- データの型:SHORTまたはLONG
- データサイズ:1
- データ値:ストリップの行数
サンプルのTIFFの場合
01 16 | 00 03 | 00 00 00 01 | 00 96 00 00
とあるのですべての行(96は10進数で150)がひとつのストリップに含まれることになります。ストリップがひとつしかないので当たり前ですが。
8. StripByteCounts
ストリップに含まれる画素データのバイト数をあらわします。ストリップが複数ある場合は、ストリップのバイト数を羅列した位置をデータ値に指定します。
- タグ番号:01 17
- データの型:SHORTまたはLONG
- データサイズ:ストリップの個数
- データ値:ストリップのデータバイト数
サンプルのTIFFでは
01 17 | 00 04 | 00 00 00 01 | 00 01 07 AC
となっており、ひとつのストリップに「107AC=67500個」のバイト数のデータがあることになります。この画像データは
なのでひとつのストリップにすべての画素データが入っていることがわかります。
9. XResolusion
幅方向の解像度です。測定単位は後に記載するResolutionUnitで決定します。
- タグ番号:01 1A
- データの型:RATIONAL
- データサイズ:1
- データ値:画像幅方向の解像度(ピクセル/測定単位)
10. YResolusion
高さ方向の解像度です。測定単位は後に記載するResolutionUnitで決定します。
- タグ番号:01 1B
- データの型:RATIONAL
- データサイズ:1
- データ値:画像の高さ方向の解像度(ピクセル/測定単位)
11. ResolusionUnit
画像解像度を決める際の測定単位です。デフォルトは2になっています。
- タグ番号:01 28
- データの型:SHORT
- データサイズ:1
- データ値:1->単位は処理プログラムにまかせる、2->インチ(inch)、3->センチメートル(cm)
サンプルTIFFでは記載がないので、単位はデフォルトでインチとなります。
12. ColorMap
PhotometricInterpretationで4のカラーマップを選んだ場合に、画素に対応した色を設定します。カラーマップテーブルがない場合はゼロをデータ値に設定します。カラーマップは画素ごとにRGBの3色を設定する必要があるので、データサイズは3☓2BitsPerSampleになります。
- タグ番号:01 40
- データの型:SHORT
- データサイズ:3☓2BitsPerSample
- データ値:カラーマップテーブルの位置
データ値にはカラーマップテーブルの位置を記述します。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー