GIF 形式
Graphics Interchange Format
ブロックでできた構造
GIF は、想定された寿命を何十年も超えて生き延びてきた形式です。 1987 年に CompuServe が作ったものですが、いまでもあちこちで見かけます。 その理由の大半はアニメーションに対応していることです。
構造はブロックの積み重ねで、最近の形式に比べると気持ちいいほど単純です。 ヘッダー、いくつかのディスクリプタ、カラーテーブル、画像データ、そして 「おしまい」を告げる 1 バイトのトレーラー。それだけです。
GIF のファイル構造
GIF のヘッダー
| Offset | Hex | ASCII | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 4749463839618002E001F70000 | GIF89a....... | ||||||||||||
バージョンの違い
最初の仕様。拡張ブロックはありません。
拡張、アニメーション、透過に対応しました。
拡張ブロック
1989 年の改訂版である GIF89a で拡張ブロックが加わり、GIF は アニメーションを持てるようになりました。拡張ブロックはすべて 0x21 で始まり、続く 1 バイトが種類を表すので、ファイルを 走査していても見つけやすい構造です。残したいもの(アニメーションの タイミング)もあれば、消したいもの(コメント)もあります。
Graphic Control Extension (0xF9)
アニメーションのタイミング、透過、廃棄方法を制御します。 アニメーション GIF では各画像ディスクリプタの直前に置かれます。 常に残します。
Comment Extension (0xFE)
プレーンテキストのコメント。作成者、作成日、ソフト名、個人的な メモなど、何でも入りえます。 PicScrub が削除します。
Application Extension (0xFF)
アプリケーション固有のデータ。いちばん重要なのはループ再生のための NETSCAPE2.0 です。XMP のメタデータが入ることもあります。
Plain Text Extension (0x01)
ほとんど使われません。GIF のカラーテーブルを使って文字を描画します。 最近のソフトはたいてい無視します。
アプリケーション拡張
NETSCAPE2.0:アニメーションのループ
アニメーション GIF を何回ループさせるかを指定します。 値が 0 なら無限ループです。
| Offset | Hex | ASCII | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 を処理する流れ
ヘッダーの検証
GIF87a または GIF89a のシグネチャを確かめます
ヘッダーのコピー
LSD とグローバルカラーテーブルはそのまま残します
拡張の選別
NETSCAPE2.0 と Graphic Control は残し、コメントと XMP は削除します
画像データの保持
画像ディスクリプタ、LCT、LZW データをそのままコピーします
トレーラーの書き込み
0x3B のトレーラーバイトでファイルを閉じます
LZW 圧縮
GIF の画像データについて少しだけ。使われているのは LZW 圧縮で、 2004 年まで特許で守られていました(90 年代にはひと騒動ありました)。 PicScrub は圧縮されたデータには一切触れません。1 バイトずつそのまま コピーするので、画質の劣化はゼロです。
これが効いてくる理由
元の LZW データをそのまま残すことで、次のことが保証されます。
- • 画質の劣化なし(ビット単位でそのままの画像)
- • 処理が速い(デコードとエンコードが不要)
- • 画像データのサイズは変わらない
GIF のメタデータの限界
GIF の良いところは、EXIF 規格より前からある形式なので、GPS の座標や カメラ情報を心配しなくていいことです。気にすべきメタデータは もっと地味なものです。
漏れうるもの
GIF のプライバシーリスクは JPEG に比べればかなり小さめです。
- • コメント拡張(作成者のメモが入っていることがあります)
- • XMP のメタデータ(まれですが、ありえます)
- • アプリケーションブロックに残るソフト名