TIFFファイルの圧縮フォーマット判別法

TIFFファイルがLZW圧縮を用いている場合、2003/08/05現在米ユニシス社の特許 (所謂 "GIF の圧縮特許問題" として有名) に抵触するのでTIFFファイルの圧縮フォーマット記述箇所を調べたので覚書。

なお、不明な点などありましたら、TIFFの規格書 (PDF) をお読みください。

  1. 0-1Byte: バイトオーダーを確認する
    MM (#4D4D)

    データは上位、下位の順序で記述される。

    例えば "1" を2Byteで記述すれば #0001 である。

    II (#4949)

    データは2Byte単位で下位、上位の順序で記述される。

    例えば "1" を2Byteで記述すれば #0100 である。

  2. 2-3Byte: TIFFファイルのバージョン番号を確認する

    TIFF Revision 6.0 Specification (Final - June 3, 1992) では固定値 "42" (#2A)が記述される。

    バイトオーダーと合わせれば、ファイル先頭4Byteは #4D4D002A か #49492A00 となる (これ以外の値を格納するファイルは本解説のTIFF形式と互換性のないフォーマットである)。

  3. 4-7Byte: Image File Directory (以下、IFD)のアドレスを確認する

    目的である Compression 情報が格納された IFD の位置が記述されているので確認する。

    例えばバイトオーダー II で #08000000 であれば以降08Byte目を起点とする。

  4. IFD 起点アドレス + 2 + 12 * n (n は 0 以上の整数): Compression Tag を確認する

    IFD 起点アドレス + 2 + 12 * n (n は 0 以上の整数) Byte目から始まる 259 (#0103) のデータを確認する。

    例えば起点アドレスが 8 の場合 10(#0A), 22(#16), 34(#22), 46(#2E), 58(#3A), 70(#46)……が調査の対象となる。

    また、259 (#0103) もバイトオーダーに従い、II なら #0301 となっている事に注意する。

  5. Compression のデータを読む

    Compression Tagから始まる12Byteは以下の構成になっている。

    Tag ( 0- 2Byte)
    259 (MM: #0103, II: #0301) 固定
    DataType ( 3- 4Byte)
    3 (MM: #0003, II: #0300) 固定
    Count ( 6- 8Byte)
    1 (MM: #0001, II: #0100) 固定
    Value ( 9-12Byte)
    Uncompressed
    1 (MM: #0001, II: #0100)
    CCITT 1D
    2 (MM: #0002, II: #0200)
    Group 3 Fax
    3 (MM: #0003, II: #0300)
    Group 4 Fax
    4 (MM: #0004, II: #0400)
    LZW
    5 (MM: #0005, II: #0500)
    JPEG
    6 (MM: #0006, II: #0600)
    Pack Bits
    32773 (MM: #8005, II: #0580)

とはいえ、人間がコードエディタなどでTIFFファイルを開いて調べるにはあまりに面倒なので、簡易判別法も。

  1. 0-1Byte目が MM なら #010300030001 を、II なら #030103000100 を検索する。
  2. 検索結果が1件なら 4Byteが自動的に Compression Value と判断される。
  3. 検索結果が複数あった場合も、続く4ByteにCompression Value Codeに合致する物が1つ (1種類) しかないならそれが Compression Value と判断される。