mizdra's blog

ぽよぐらみんぐ

GIFフォーマットのわかりにくい点をわりやすくしてみた

こんばんは。mizdraです。

私がGIFフォーマットについて勉強していた時に、わかりにくいと感じたところをまとめて再度見なおした時にわかるようにしてみました。

GIFフォーマット仕様書日本語訳サイトが閉鎖してしまったので、情報を探し求めている方の助けになればと思って書き記します。

Block

GIFは多数のブロックで構成されており、それぞれのブロックごとに別々の役割が与えられています。 公式の仕様書では、11種類のブロックが定義されています。以下がそのブロックです。

  • Header
  • Logical Screen Descriptor
  • Global Color Table
  • Image Descriptor
  • Local Color Table
  • Table Based Image Data
  • Graphic Control Extension
  • Comment Extension
  • Plain Text Extension
  • Application Extension
  • Trailer

これではどれがどのような役割を持っているかが分かりにくいので、細かく分類していきます。

 

ブロックの役割

各ブロックがGIFイメージに対してどのような役割を持っているかについて整理します。

Header

位置: ファイルの先頭

出現条件: 必須

出現回数: 1回

バージョン: 指定なし

有効範囲と修飾: GIFファイル全体, なし

説明:

GIFの署名とバージョンが6Bytesで書き込まれています。

署名は "GIF" 、バージョンは "87a", "89a" のどちらかです。

バージョンはそのファイルを正常に表現出来る最も初期のバージョンであることが推奨されます。

 

Logical Screen Descriptor

位置: "Header" の直後

出現条件: 必須

出現回数: 1回

バージョン指定なし

有効範囲と修飾: GIFファイル全体, なし

説明:

GIFイメージ全体の位置・大きさ・背景色・画素に関する情報などが含まれています。

また、このブロックの'Global Color Table Flag' では "Global Color Table" の有無を、 'Size of Global Color Table' では "Global Color Table" のサイズを定義しています。

 

Global Color Table

位置: "Logical Screen Descriptor" の直後

出現条件'Global Color Table Flag' が "1" のとき

出現回数: 1回

バージョン: 87a以降

有効範囲と修飾: GIFファイル全体, なし

説明:

GIFイメージ全体で使用されるパレットです。

サイズは直前の 'Size of Global Color Table' で定義されています。

 

Image Descriptor

位置"Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後

出現条件: フレームが1つ以上ある時

出現回数: フレームの個数分だけ出現

バージョン: 87a以降*1

 

Trailer

位置: "Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後で、ファイルの最後

出現条件: 必須

出現回数: 1回

バージョン: 87a以降

有効範囲と修飾: なし, なし

説明:

GIFファイルの終了を表します。

固定値 "0x3B" です。

ブロックの順序

GIFの11種類のブロックの順序には規則性があります。(当たり前だけど)

また、ブロックによってはファイル中に何度も出てくるものもあれば、一つしかないものもあります。

その為、まずは出現回数でブロックを分類してみましょう。

一回だけ出現するブロック

  • Header
  • Logical Screen Descriptor
  • Global Color Table
  • Trailer

何度も出現するブロック

  • Image Descriptor
  • Local Color Table
  • Table Based Image Data
  • Graphic Control Extension
  • Comment Extension
  • Plain Text Extension
  • Application Extension

Header Block

このブロックはファイル中に1つしか存在しません。

必ず下記の順序で並んでいます。

  • Header
  • Logical Screen Descriptor
  • Global Color Table

Image Block

このブロックはファイル中にいくつでも存在します。 「Local Color Table」は存在しない場合があります。 また、必ず下記の順序で並んでいます。

  • Image Descriptor
  • Local Color Table
  • Table Based Image Data

これらのブロックを使って、さらに細かく分類します。

Image Frame

このフレームは画像に関するブロックをまとめたものです。 「Graphic Control Extension」は存在しない場合があります。 また、必ず下記の順序で並んでいます。

  • Graphic Control Extension
  • Image Block

Text Frame

このフレームは文字に関するブロックをまとめたものです。 「Graphic Control Extension」は存在しない場合があります。 また、必ず下記の順序で並んでいます。

  • Graphic Control Extension
  • Plain Text Extension

では、改めてGIFファイルの構造を見てみましょう。

詳しいGIFファイルの構造

  • Header Block
  • ...
  • Comment Extension, または Application Extension (Special Blocks)
  • Image Frame, または Text Frame (Frames)
  • ...
  • Trailer

「Special Blocks」や「Frames」は存在しない場合があります。 また、「Special Blocks」や「Frames」の数には制限がありません。

mizdraより

後でまた付けたすので、今日はここまでにします。

*1:'

有効範囲と修飾: 後続の "Table Based Image Data", "Graphic Control Extension" に修飾される

説明:

フレームの位置・大きさ・画素に関する情報などが含まれています。

また、このブロックの'Local Color Table Flag' では "Local Color Table" の有無を、 'Size of Local Color Table' では "Local Color Table" のサイズを定義しています。

 

Local Color Table

位置: "Image Descriptor" の直後

出現条件: 直前の 'Local Color Table Flag' が "1" のとき

出現回数フレームの個数分だけ出現

バージョン: 87a以降

 

有効範囲と修飾: 後続の "Table Based Image Data", なし

 

説明:

フレームで使用されるパレットです。

サイズは直前の 'Size of Local Color Table' で定義されています。

 

Table Based Image Data

位置: "Local Color Table" の直後

出現条件フレームが1つ以上ある時

出現回数: フレームの個数分だけ出現

バージョン: 87a以降(('

有効範囲と修飾: なし, "Graphic Control Extension" に修飾される

説明:

LZW圧縮されたイメージデータが含まれています。

 

Graphic Control Extension

位置: "Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後

出現条件: 任意

出現回数: 任意

バージョン: 89a以降

有効範囲と修飾: 後続の "Image Descriptor" と "Table Based Image Data", なし

説明:

アニメーションをする時に必要な情報が含まれています。

 

Comment Extension

位置: "Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後

出現条件: 任意

出現回数: 任意

バージョン: 89a以降

有効範囲と修飾: なし, なし

説明:

グラフィック部分とは関係のないテキストが含まれています。

このブロックに格納されているテキストは画像編集ソフトで読み取り・書き込みをすることが多いです。

 

Plain Text Extension

位置: "Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後

出現条件: 任意

出現回数: 任意

バージョン: 89a以降

有効範囲と修飾: なし, "Graphic Control Extension" に修飾される

説明:

グラフィック部分と関係のあるテキストが含まれています。

このブロックに格納されているテキストは仕様書ではフレームにそれらを表示することになっていますが、実際にこのブロックに対応しているソフトウェアは恐らく存在しないでしょう。

 

Application Extension

位置: "Logical Screen Descriptor" ("Global Color Table" が存在しない時), "Global Color Table", "Graphic Control Extension", "Comment Extension", "Plain Text Extension", "Application Extension" のいずれかの直後

出現条件: 任意

出現回数: 任意

バージョン: 89a以降

有効範囲と修飾: なし, なし

説明:

アプリケーションに関する情報が含まれています。

2014年11月の時点で、'Application Identifier + Appl. Authentication Code' の例は、" NETSCAPE2.0", ""ANIMEXTS1.0" の2つが使われており、どちらも意味は同じです。((

Netscape Looping Application Extension (GIF Unofficial Specification) - vurdalakov.net

AnimExts Looping Application Extension (GIF Unofficial Specification) - vurdalakov.net