PicScrub logoPicScrub
対応形式に戻る

GIF 形式

Graphics Interchange Format

ブロックでできた構造

GIF は、想定された寿命を何十年も超えて生き延びてきた形式です。 1987 年に CompuServe が作ったものですが、いまでもあちこちで見かけます。 その理由の大半はアニメーションに対応していることです。

構造はブロックの積み重ねで、最近の形式に比べると気持ちいいほど単純です。 ヘッダー、いくつかのディスクリプタ、カラーテーブル、画像データ、そして 「おしまい」を告げる 1 バイトのトレーラー。それだけです。

GIF のファイル構造

Header
LSD
GCT
Extensions
Image Data
Trailer
Header
6 バイト
GIF87a または GIF89a
LSD
7 バイト
論理スクリーンディスクリプタ
GCT
768 バイト
グローバルカラーテーブル(任意)
Extensions
100 バイト
拡張ブロック(メタデータ)
Image Data
可変長
画像ディスクリプタ + LZW データ
Trailer
1 バイト
0x3B の終端バイト

GIF のヘッダー

GIF のシグネチャ
バージョン(89a)
幅(640)
高さ(480)
パックドフィールド
背景色のインデックス
画素のアスペクト比
OffsetHexASCII
0000
4749463839618002E001F70000
GIF89a.......

バージョンの違い

GIF87a

最初の仕様。拡張ブロックはありません。

GIF89a

拡張、アニメーション、透過に対応しました。

拡張ブロック

1989 年の改訂版である GIF89a で拡張ブロックが加わり、GIF は アニメーションを持てるようになりました。拡張ブロックはすべて 0x21 で始まり、続く 1 バイトが種類を表すので、ファイルを 走査していても見つけやすい構造です。残したいもの(アニメーションの タイミング)もあれば、消したいもの(コメント)もあります。

Graphic Control Extension (0xF9)

アニメーションのタイミング、透過、廃棄方法を制御します。 アニメーション GIF では各画像ディスクリプタの直前に置かれます。 常に残します。

21 F9 04 [disposal] [delay] [transparent] 00

Comment Extension (0xFE)

プレーンテキストのコメント。作成者、作成日、ソフト名、個人的な メモなど、何でも入りえます。 PicScrub が削除します。

21 FE [size] [comment data...] 00

Application Extension (0xFF)

アプリケーション固有のデータ。いちばん重要なのはループ再生のための NETSCAPE2.0 です。XMP のメタデータが入ることもあります。

21 FF 0B [app identifier] [auth code] [data...] 00

Plain Text Extension (0x01)

ほとんど使われません。GIF のカラーテーブルを使って文字を描画します。 最近のソフトはたいてい無視します。

アプリケーション拡張

NETSCAPE2.0:アニメーションのループ

アニメーション GIF を何回ループさせるかを指定します。 値が 0 なら無限ループです。

拡張の開始
ブロックサイズ(11)
NETSCAPE2.0
サブブロックのサイズ
サブブロックの ID
ループ回数
終端バイト
OffsetHexASCII
0000
21FF0B4E45545343415045322E300301000000
!..NETSCAPE2.0.....

PicScrub はアニメーションの挙動を保つため NETSCAPE2.0 を残します。

XMP Data:Extensible Metadata Platform

アプリケーション識別子: XMP DataXMP。XML 形式の XMP/RDF メタデータがそのまま入っています。

PicScrub は XMP のアプリケーション拡張を削除します。

アニメーションを壊さない

GIF でやっかいなのは、残すべきアニメーションのデータと、消したい メタデータを見分けることです。どちらも拡張ブロックに入っているので、 拡張をまとめて捨てるわけにはいきません。

アニメーションのために残すもの

  • • NETSCAPE2.0 のループ回数
  • • Graphic Control Extension
  • • フレームの表示時間
  • • 廃棄方法
  • • 透過色のインデックス
  • • ローカルカラーテーブル

削除されるもの

  • • コメント拡張
  • • XMP のアプリケーションブロック
  • • 正体不明のアプリケーションブロック
  • • Plain Text 拡張

PicScrub が GIF を処理する流れ

1

ヘッダーの検証

GIF87a または GIF89a のシグネチャを確かめます

2

ヘッダーのコピー

LSD とグローバルカラーテーブルはそのまま残します

3

拡張の選別

NETSCAPE2.0 と Graphic Control は残し、コメントと XMP は削除します

4

画像データの保持

画像ディスクリプタ、LCT、LZW データをそのままコピーします

5

トレーラーの書き込み

0x3B のトレーラーバイトでファイルを閉じます

LZW 圧縮

GIF の画像データについて少しだけ。使われているのは LZW 圧縮で、 2004 年まで特許で守られていました(90 年代にはひと騒動ありました)。 PicScrub は圧縮されたデータには一切触れません。1 バイトずつそのまま コピーするので、画質の劣化はゼロです。

これが効いてくる理由

元の LZW データをそのまま残すことで、次のことが保証されます。

  • • 画質の劣化なし(ビット単位でそのままの画像)
  • • 処理が速い(デコードとエンコードが不要)
  • • 画像データのサイズは変わらない

GIF のメタデータの限界

GIF の良いところは、EXIF 規格より前からある形式なので、GPS の座標や カメラ情報を心配しなくていいことです。気にすべきメタデータは もっと地味なものです。

漏れうるもの

GIF のプライバシーリスクは JPEG に比べればかなり小さめです。

  • • コメント拡張(作成者のメモが入っていることがあります)
  • • XMP のメタデータ(まれですが、ありえます)
  • • アプリケーションブロックに残るソフト名