この記事には、過度に詳細な記述が含まれています。特に、カラーパレットとファイル形式の構造についてです。関連情報を( 2025年2月) |
| GIF | |
|---|---|
| ファイル名拡張子 | .gif |
| インターネットメディアの種類 | image/gif |
| タイプコード | GIFf |
| 統一型識別子(UTI) | com.compuserve.gif |
| 魔法の数字 | GIF87a/GIF89a |
| 開発者 | コンピュサーブ |
| 初回リリース | 1987年6月15日[ 1 ] (1987年6月15日) |
| 最新リリース | |
| フォーマットの種類 | ロスレスビットマップ画像形式 |
| Webサイト | www |
グラフィックス・インターチェンジ・フォーマット(GIF、/ ɡɪ f / GHIFまたは/ dʒɪ f / JIF)は、アメリカのコンピュータ科学者スティーブ・ウィルハイトが率いるオンラインサービスプロバイダーCompuServeのチームによって開発され、1987年6月15日にリリースされたビットマップ画像フォーマットである。[ 1 ]
このフォーマットは1ピクセルあたり最大8ビットを格納できるため、1つの画像で24ビットRGBカラースペースから最大256色のパレットを参照できます。また、1つのファイルで複数の画像を表現できるため、アニメーションに使用でき、フレームごとに最大256色の個別のパレットを使用できます。これらのパレット制限により、GIFはカラー写真やグラデーションのある画像の再現には適していませんが、単色の領域を持つグラフィックやロゴなどのシンプルな画像には適しています。
GIF画像は、画質を損なわずにファイルサイズを削減するために、Lempel-Ziv-Welch(LZW)ロスレスデータ圧縮技術を用いて圧縮されています。かつては、その幅広い実装とアプリケーションやオペレーティングシステム間の移植性から、ワールドワイドウェブで広く使用されていましたが、容量と画質の問題から使用頻度は低下し、静止画像にはPNG 、動画にはMP4といった新しい形式に置き換えられることが多くなりました。この文脈では、元のファイル形式とは無関係であるにもかかわらず、短い動画クリップが「GIF」と呼ばれることがあります。[ 3 ]


CompuServeは1987年6月15日、ファイルダウンロードエリアにカラー画像フォーマットを提供するためにGIFを導入しました。これは、それまで白黒のみだったランレングス符号化フォーマットに取って代わりました。GIFが普及したのは、Lempel-Ziv-Welchデータ圧縮方式を採用していたためです。これはPCXやMacPaintで使用されていたランレングス符号化方式よりも効率が良かったため、低速モデムでもかなり大きな画像でもかなり速くダウンロードできました。
GIFのオリジナルバージョンは87aと呼ばれていました。[ 1 ]このバージョンでは既にストリーム内で複数の画像をサポートしていました。
1989年、CompuServeは89aと呼ばれる拡張バージョンをリリースしました。[ 2 ]このバージョンでは以下の機能が追加されました。
2 つのバージョンは、ファイルの最初の 6バイト(「マジック ナンバー」または署名) を調べることで区別できます。ASCII として解釈すると、それぞれ「GIF87a」または「GIF89a」と表示されます。
CompuServeは、多くのコンピュータ向けにダウンロード可能な変換ユーティリティを提供することで、GIFの普及を促進しました。例えば、1987年12月までに、Apple IIGSユーザーはAtari STやCommodore 64で作成された画像を閲覧できるようになりました。[ 4 ] GIFは、ウェブサイトで一般的に使用された最初の2つの画像形式のうちの1つであり、もう1つは白黒のXBMでした。[ 5 ]
1995 年 9 月、 Netscape Navigator 2.0にアニメーション GIF をループする機能が追加されました。
GIFはCompuServeによって開発されましたが、1985年にUnisysが特許を取得したLempel-Ziv-Welch(LZW)ロスレスデータ圧縮アルゴリズムを採用していました。1994年にUnisysとCompuServeの間でライセンス契約をめぐる論争が起こり、 Portable Network Graphics (PNG)規格の開発が促進されました。2004年、GIFに使用されていた独自の圧縮技術に関するすべての特許が失効しました。
複数の画像を制御データとともに 1 つのファイルに保存する機能は、単純なアニメーションを作成するために Web 上で広く使用されています。
オプションのインターレース機能は、画像の走査線を不規則に保存することで、部分的にダウンロードされた画像でもある程度認識できるようにするもので、ユーザーが必要なものでない場合はダウンロードを中止できるため、GIFの人気にも貢献しました。 [ 6 ]
2015年5月にFacebookはGIFのサポートを追加しました。[ 7 ] [ 8 ] 2014年にはTwitterも、 2018年にはInstagramもGIFのサポートを追加しました。 [ 9 ]
2016年、インターネットアーカイブはジオシティーズアーカイブからGIFの検索可能なライブラリを公開した。[ 10 ] [ 11 ]
GIFという単語は、多くの辞書の最新版に名詞として掲載されています。2012年には、オックスフォード大学出版局のアメリカ支部がGIFを動詞としても認め、「GIFファイルを作成する」という意味で、「GIFは夏季オリンピックのシーンを共有するのに最適な媒体だった」という表現が用いられています。同出版局の辞書編集者は、GIFが「研究やジャーナリズムを含む本格的な用途を持つツール」へと進化したとして、GIFを今年の言葉に選出しました。[ 12 ] [ 13 ]

GIFの最初の文字の発音は1990年代から議論されてきました。英語で最も一般的な発音は/ dʒɪf /です。ⓘ(ginのように軟音のg)と/ ɡɪf /ⓘ ( giftのように硬いgで発音)と、文字G音素。このフォーマットの作成者は、頭字語GIF を/ dʒ ɪ f / (軟音のgでとウィルハイトは、この発音は意図的にアメリカのピーナッツバターブランドJif を、CompuServe の従業員はよく「こだわりのある開発者は GIF を選ぶ」と冗談を言っていました。これは Jif のテレビコマーシャルのパロディーです。 [ 14 ]しかし、この単語は広く/ ɡ ɪ f / (硬音のgで発音)さ、 [ 15 ]世論調査では、この硬音のg方が一般的であることが示されています。 [ 16 ] [ 17 ]
Dictionary.com [ 18 ]では両方の発音が引用されており、 / dʒ ɪ f /が主な発音である一方、 Cambridge Dictionary of American English [ 19 ]では硬いgの発音のみが示されている。Merriam -Webster's Collegiate Dictionary [ 20 ]とOxford Dictionariesでは両方の発音が引用されているが、硬いg が最初に置かれ、 / ɡ ɪ f、dʒ ɪ f /となっている。 [ 21 ] [ 22 ] [ 23 ] [ 24 ] New Oxford American Dictionary では第2版では/ dʒ ɪ f /のみが掲載されていたが[ 25 ] 、第3版では/ dʒ ɪ f、ɡ ɪ f /に更新された。 [ 26 ]
発音をめぐる意見の相違は、インターネット上で白熱した議論を巻き起こした。2013年のウェビー賞授賞式で生涯功労賞を受賞した際、ウィルハイト氏は公に硬いgの発音を否定した。[ 15 ] [ 27 ] [ 28 ]彼のスピーチはTwitterで1万7000件以上の投稿と数十のニュース記事を生み出した。[ 29 ]ホワイトハウス[ 15 ]とテレビ番組「Jeopardy!」も2013年にこの議論に加わった。[ 28 ] 2020年2月、 Jifブランドの所有者であるJM Smucker Companyは、アニメーション画像データベースおよび検索エンジンのGiphyと提携し、「Jif vs. GIF」(ハッシュタグ#JIFvsGIF)の限定版ピーナッツバター瓶を発売した。この瓶のラベルには、軟らかいgの発音はピーナッツバターのみを指し、GIFは硬いgの発音でのみ発音するとユーモラスに宣言されていた。[ 30 ]
GIFは、ロゴなど、色数が限られ、エッジのはっきりした線画に適しています。これは、均一な色で平坦な領域と明確なエッジを優先するロスレス圧縮形式の利点を活用しています。[ 31 ]また、ゲーム用の低色スプライトデータの保存にも使用できます。[ 32 ] GIFは、短いアニメーションや低解像度のビデオクリップ、または言葉の代わりに感情や気持ちを伝えるオンラインメッセージングのリアクションに使用できます。Tumblr 、[ 33 ] Facebook、Twitterなどのソーシャルメディアプラットフォームで人気があります。[ 34 ]
概念的には、GIFファイルは、0個以上の「画像」で構成された固定サイズのグラフィック領域(「論理画面」)を記述します。多くのGIFファイルは、論理画面全体を占める単一の画像で構成されます。また、論理画面を複数のサブ画像に分割するファイルもあります。これらの画像は、アニメーションGIFファイルにおいてアニメーションフレームとして機能する場合もありますが、この場合も論理画面全体を占める必要はありません。
GIFファイルは、バージョンを示す固定長のヘッダー(「GIF87a」または「GIF89a」)で始まり、その後に論理スクリーンのピクセル寸法やその他の特性を示す固定長の論理スクリーン記述子(LSD)が続きます。スクリーン記述子は、グローバルカラーテーブル(GCT)の有無とサイズも指定できます。GCTが存在する場合は、GCTが次に続きます。
その後、ファイルは次のタイプのセグメントに分割され、各セグメントは 1 バイトのセンチネルで始まります。
',')'!')';')。ファイルの最後のバイトになります。画像は固定長の画像記述子で始まります。この記述子は、ローカルカラーテーブル(存在する場合、次に続く)の有無とサイズを指定します。画像データは、エンコードされていないシンボルのビット幅を示す1バイト(2色画像であっても少なくとも2ビット幅である必要があります)に続き、LZWエンコードされたデータを含む一連のサブブロックが続きます。
拡張ブロック(87a仕様で既に定義されているメカニズムを介して87a定義を「拡張」するブロック)は、センチネル、拡張の種類を指定する追加バイト、および拡張データを含む一連のサブブロックで構成されます。画像を変更する拡張ブロック(オプションのアニメーション遅延時間やオプションの透明背景色を指定するグラフィックコントロール拡張など)は、参照する画像を含むセグメントの直前に配置する必要があります。
各サブブロックは、そのサブブロック内の後続のデータバイト数(1~255)を示すバイトで始まります。一連のサブブロックは、空のサブブロック(0バイト)で終了します。
この構造により、すべての部分が理解できない場合でもファイルを解析できます。87aでマークされたGIFには拡張ブロックが含まれる場合があります。これは、デコーダーが理解できない拡張機能に含まれる機能を除いたファイルを読み取って表示できるようにするためです。
ファイル形式の詳細はGIF仕様に記載されています。[ 2 ]

GIFはパレットベースの画像形式です。各フレームには、24ビットRGBカラースペースから選択された最大256色が含まれます。これらの色はテーブル(パレット)で定義され、各ピクセルはこのパレットのインデックスを参照します。元々、この方式は色数のサポートが限られているハードウェアに適していましたが、現在では、シンプルなグラフィック、線画、ロゴ、基本的なアニメーションなどに最適な形式となっています。より多くの色を近似するために、ディザリング技術が使用されることもありますが、画像の鮮明度が低下したり、ファイルサイズが大きくなったりすることがあります。
GIFファイルにはグローバルカラーテーブルが含まれ、各フレームにはローカルカラーテーブルが含まれる場合があります。スペースを節約するため、仕様では2 n色のカラーテーブル( nは1から8までの任意の値)が許容されています。ほとんどのグラフィックアプリケーションは、これらのテーブルサイズのGIF画像を読み込んで表示できますが、画像作成時にすべてのサイズをサポートしていないものも少なくありません。2色、16色、256色のカラーテーブルが広くサポートされています。
GIF は透明性をサポートしており、1 つの色を透明としてマークして、背景やレイヤー化された効果を透かして表示することができます。
GIFはトゥルーカラー画像に使用されることはほとんどありませんが、実際にはそうすることは可能です。[ 35 ] [ 36 ] GIF画像は複数の画像ブロックを含むことができ、各ブロックは独自の256色パレットを持つことができ、ブロックを並べて完全な画像を作成することができます。また、GIF89a仕様では「透明」色の概念が導入され、各画像ブロックは255色の可視色と1色の透明色からなる独自のパレットを持つことができます。画像ブロックを重ね合わせ、各レイヤーの可視部分を上のレイヤーの透明部分を通して見せることで、完全な画像を作成できます。

フルカラー画像をGIF形式でレンダリングするには、元の画像を255色または256色以下の小さな領域に分割する必要があります。各領域は、それぞれ独自のローカルパレットを持つ個別の画像ブロックとして保存され、画像ブロックを並べて表示する(タイル表示または半透明の画像ブロックを重ねる)ことで、完全なフルカラー画像が表示されます。例えば、画像を16×16ピクセルのタイル(合計256ピクセル)に分割すると、タイルのローカルパレットの制限である256色を超える色は含まれなくなります。ただし、より大きなタイルを使用することで、類似した色が結合され、色情報が多少失われる場合があります。[ 35 ]
各画像ブロックは独自のローカルカラーテーブルを持つことができるため、多数の画像ブロックを含むGIFファイルは非常に大きくなり、フルカラーGIFの有用性が制限されます。[ 36 ]さらに、すべてのGIFレンダリングプログラムがタイル画像やレイヤー画像を正しく処理できるわけではありません。多くのレンダリングプログラムはタイルやレイヤーをアニメーションフレームとして解釈し、アニメーションとして順番に表示します。[ 35 ]ほとんどのウェブブラウザは0.1秒以上の遅延時間でフレームを自動的に表示します。[ 37 ] [ 38 ]
| Microsoft ペイントは、小さな白黒画像を次の GIF ファイル(拡大表示)として保存します。ペイントは GIF を最大限に活用していません。カラーテーブルが不必要に大きく(使用される 2 色ではなく 256 色を格納)、シンボルの幅も大きいため、この GIF ファイルは 15 ピクセルの画像を効率的に表現できていません。グラフィック コントロール拡張ブロックはカラー インデックス 16(16 進数で 10)を透明として宣言していますが、このインデックスは画像では使用されていません。画像データに表示されるカラー インデックスは 10 進数の 40 と 255 のみで、グローバル カラー テーブルではそれぞれ白と黒にマッピングされます。 | ![]() サンプル画像(拡大)、実寸大 幅3ピクセル×高さ5ピクセル |
次の表の 16 進数は、形式仕様で規定されているように、 リトルエンディアンバイト順になっています。
画像のピクセルデータは、左上から水平にスキャンされ、LZWエンコードによってコードに変換され、バイトにマッピングされてファイルに保存されます。ピクセルコードは通常、バイトの8ビットサイズと一致しないため、「リトルエンディアン」方式でバイトにパックされます。つまり、最初のコードの最下位ビットは最初のバイトの最下位ビットに格納され、コードの上位ビットはバイトの上位ビットに格納され、必要に応じて次のバイトの下位ビットに繰り越されます。後続の各コードは、未使用の最下位ビットから順に格納されます。
このバイトストリームは、一連の「サブブロック」としてファイルに保存されます。各サブブロックの最大長は255バイトで、サブブロック内のデータバイト数を示すバイトが先頭に付きます。一連のサブブロックは、空のサブブロック(データバイトが0バイトであることを示す単一の0バイト)で終了します。
上記のサンプル画像では、9 ビット コードとバイト間の可逆マッピングが以下に示されています。
| 9ビットコード | バイト | ||
|---|---|---|---|
| 16進数 | バイナリ | バイナリ | 16進数 |
| 100 | 1 00000000 | 00000000 | 00 |
| 028 | 00 0101000 | 0101000 1 | 51 |
| 0FF | 011 111111 | 111111 00 | FC |
| 103 | 1000 00011 | 00011 011 | 1B |
| 102 | 10000 0010 | 0010 1000 | 28 |
| 103 | 100000 011 | 011 10000 | 70 |
| 106 | 1000001 10 | 10 100000 | A0 |
| 107 | 10000011 1 | 1 1000001 | C1 |
| 10000011 | 83 | ||
| 101 | 1 00000001 | 00000001 | 01 |
| 0000000 1 | 01 | ||
わずかな圧縮が見られます。当初15バイトで定義されたピクセルカラーは、制御コードを含む12バイトのコードで正確に表現されます。9ビットコードを生成するエンコードプロセスを以下に示します。ローカル文字列はパレットからピクセルカラー番号を蓄積し、ローカル文字列がコードテーブルに見つかる限り、出力アクションは発生しません。文字列の追加によってテーブルが初期サイズから拡大する前に到着する最初の2つのピクセルには特別な処理が行われます。各出力コードの後、ローカル文字列は最新のピクセルカラー(出力コードに含まれなかったカラー)に初期化されます。
表 9ビット文字列 --> コード コード アクション #0 | 000h 9ビットコードのルートテーブルを初期化する パレット | : 色 | : #255 | 0FFh クリア | 100時間 終了 | 101時間 | 100時間クリア ピクセルローカル カラーパレット文字列 | BLACK #40 28 | 028h 常に出力される最初のピクセル WHITE #255 FF | 表内の文字列が見つかりました 28 FF | 102h 常に最初の文字列をテーブルに追加する FF | ローカル文字列を初期化する WHITE #255 FF FF | テーブルに文字列が見つかりません | 0FFh - 前の文字列の出力コード FF FF | 103h - 最新の文字列をテーブルに追加 FF | - ローカル文字列を初期化する WHITE #255 FF FF | テーブル内の文字列が見つかりました BLACK #40 FF FF 28 | テーブルに文字列が見つかりません | 103h - 前の文字列の出力コード FF FF 28 | 104h - 最新の文字列をテーブルに追加 28 | - ローカル文字列を初期化する WHITE #255 28 FF | 表に見つかった文字列 WHITE #255 28 FF FF | テーブルに文字列が見つかりません | 102h - 前の文字列の出力コード 28 FF FF | 105h - 最新の文字列をテーブルに追加 FF | - ローカル文字列を初期化する WHITE #255 FF FF | テーブル内の文字列が見つかりました WHITE #255 FF FF FF | テーブルに文字列が見つかりません | 103h - 前の文字列の出力コード FF FF FF | 106h - 最新の文字列をテーブルに追加 FF | - ローカル文字列を初期化する WHITE #255 FF FF | テーブル内の文字列が見つかりました WHITE #255 FF FF FF | テーブル内の文字列が見つかりました WHITE #255 FF FF FF FF | テーブルに文字列が見つかりません | 106h - 前の文字列の出力コード FF FF FF FF| 107h - 最新の文字列をテーブルに追加 FF | - ローカル文字列を初期化する WHITE #255 FF FF | テーブル内の文字列が見つかりました WHITE #255 FF FF FF | テーブル内の文字列が見つかりました WHITE #255 FF FF FF FF | 表内の文字列が見つかりました ピクセルはもうない 107h - 最後の文字列の出力コード 101時間終了
分かりやすくするために、上記のテーブルは長さが増加する文字列で構成されているように示されています。この方式は機能しますが、テーブルが消費するメモリ量は予測できません。実際には、格納される新しい文字列は、以前に格納された文字列に1文字を追加したもので構成されるため、メモリを節約できます。各アドレスには、既存のアドレスと1文字の2ワードのみを格納するのが経済的です。
LZWアルゴリズムでは、各ピクセルごとにテーブルを検索する必要があります。最大4096個のアドレスを線形検索すると、コーディング速度が低下します。実際には、コードは数値順に格納できます。これにより、各検索はSAR(一部のADCで使用されている逐次近似レジスタ)によって実行され、12回の絶対値比較のみで済みます。この効率化のために、コードと実際のメモリアドレスを変換するための追加のテーブルが必要です。この追加のテーブル管理は、新しいコードが格納される場合にのみ必要であり、これはピクセルレートよりもはるかに低いレートで発生します。
デコードは、保存されたバイトを9ビットコードにマッピングすることから始まります。これらはデコードされ、以下に示すようにピクセルの色を復元します。エンコーダで使用されるものと同一のテーブルは、以下の規則に従って文字列を追加することで構築されます。
| はい | ローカルコードの文字列を追加し、その後に受信コードの文字列の最初のバイトを追加します。 |
| いいえ | ローカルコードの文字列を追加し、その後にその文字列の最初のバイトのコピーを追加します。 |
9ビットシフト----> ローカルテーブル ピクセルコード コードコード --> 文字列 パレットカラー アクション 100h 000h | #0 9ビットコードのルートテーブルを初期化する : | パレット : | 色 0FFh | #255 100時間 | クリア 101時間 | 終了 028h | #40 BLACK 最初のピクセルをデコード 0FFh 028h | テーブルに着信コードが見つかりました | #255 WHITE - テーブルから文字列を出力する 102h | 28 FF - テーブルに追加 103h 0FFh | 受信コードがテーブルに見つかりません 103h | FF FF - テーブルに追加 | - テーブルから文字列を出力する | #255 ホワイト | #255 ホワイト 102h 103h | テーブルに着信コードが見つかりました | - テーブルから文字列を出力する | #40 ブラック | #255 ホワイト 104h | FF FF 28 - テーブルに追加 103h 102h | テーブルに着信コードが見つかりました | - テーブルから文字列を出力する | #255 ホワイト | #255 ホワイト 105h | 28 FF FF - テーブルに追加 106h 103h | 受信コードがテーブルに見つかりません 106h | FF FF FF - テーブルに追加 | - テーブルから文字列を出力する | #255 ホワイト | #255 ホワイト | #255 ホワイト 107h 106h | 受信コードがテーブルに見つかりません 107h | FF FF FF FF - テーブルに追加 | - テーブルから文字列を出力する | #255 ホワイト | #255 ホワイト | #255 ホワイト | #255 ホワイト 101時間 | 終了
例の256色よりも小さいパレットでは、より短いコード長を使用できます。パレットが64色(つまり色インデックスが6ビット幅)の場合、シンボルの範囲は0~63、シンボル幅は6ビット、コードは7ビットから開始できます。実際には、シンボル幅はパレットサイズと一致する必要はありません。デコードされた値が常にパレットの色数よりも小さい限り、シンボルの幅は2~8、パレットサイズは2~256の2の累乗にすることができます。例えば、パレットの最初の4色(値0~3)のみを使用する場合、シンボルの幅は2ビット、コードは3ビットから開始できます。
逆に、0と1の値のみを使用する場合でも、シンボル幅を8に設定できます。これらのデータには2色テーブルのみが必要です。このようにファイルをエンコードする意味はありませんが、2色画像でも同様の動作が通常発生します。0と1の値のみを使用する場合でも、最小シンボル幅は2です。
コードテーブルには、2つの特殊コードclrとend 、そして処理中に追加される文字列用のコードを格納するため、シンボルサイズより1ビット長いコードが初期状態で含まれています。テーブルがいっぱいになると、より多くの文字列を格納するためのスペースを確保するためにコード長が増加し、最大コード長は4095 = FFF(hex)です。デコーダーはテーブルを構築する際に、コード長の増加を追跡し、それに応じて入力バイトを展開します。
![]() 7ビットシンボル(128色、8ビットコード)を含む46×46の非圧縮GIF画像。画像をクリックするとコードの説明が表示されます。 |
GIFエンコード処理を変更することで、LZW圧縮を施さずにGIF画像として表示可能なファイルを作成できます。この手法は、もともと特許侵害を回避するために導入されました。非圧縮GIFは、個々のピクセルにアクセスして読み取りやペイントができるため、グラフィックプログラマーにとって便利な中間形式にもなります。非圧縮GIFファイルは、画像エディタに渡すだけで通常のGIFファイルに変換できます。
修正されたエンコード方式では、LZWテーブルの構築は無視され、ルートパレットコードとCLEARおよびSTOPのコードのみが出力されます。これによりエンコードはよりシンプルになります(コード値とパレットコードが1対1で対応)。ただし、圧縮効果はすべて犠牲になります。画像内の各ピクセルは、そのカラーインデックスを示す出力コードを生成します。非圧縮GIFを処理する場合、標準的なGIFデコーダーは辞書テーブルに文字列を書き込むことができますが、コード幅が大きくなるとビットからバイトへのパッキング方法が異なるため、コード幅が大きくなることは決してありません。
シンボル幅がnの場合、幅n +1のコードは自然に 2 つのブロックに分けられます。1 つは単一のシンボルをコード化するための2 nコードの下部ブロック、もう 1 つは長さが 1 より大きいシーケンスに対してデコーダーが使用する2 nコードの上部ブロックです。上部ブロックの最初の 2 つのコードはすでに使用されています。2 nは CLEAR、2 n + 1は STOP です。デコーダーは上部ブロックの最後のコード2 n +1 − 1を使用しないようにする必要があります。デコーダーがそのスロットを埋めると、コード幅が増加するためです。したがって、上部ブロックには、コード幅の増加をトリガーしない2 n − 3 個のコードがデコーダーで使用できます。デコーダーはテーブルの維持において常に 1 ステップ遅れているため、エンコーダーから最初のコードを受信してもテーブル エントリは生成されませんが、後続のコードごとに 1 つ生成します。したがって、エンコーダーはコード幅の増加をトリガーせずに2 n − 2 個のコードを生成できます。したがって、エンコーダはデコーダにコーディング辞書をリセットさせるために、 2 n − 2コード以下の間隔で追加のCLEARコードを出力する必要があります。GIF規格では、このような追加のCLEARコードを画像データにいつでも挿入できます。複合データストリームは、それぞれ1~255バイトのサブブロックに分割されます。
上記の 3×5 のサンプル画像の場合、次の 9 ビット コードは「クリア」(100)、その後にスキャン順の画像ピクセル、そして「停止」(101) を表します。
100 028 0FF 0FF 0FF 028 0FF 0FF 0FF 0FF 0FF 0FF 0FF 0FF 0FF 0FF 101
上記のコードがバイトにマッピングされた後、圧縮されていないファイルは圧縮されたファイルと次のように異なります。
| バイト番号(16進数) | 16進数 | テキストまたは値 | 意味 |
|---|---|---|---|
| 320 | 14 | 20 | 20バイトの非圧縮画像データが続く |
| 321 | 00 51 FC FB F7 0F C5 BF 7F FF FE FD FB F7 EF DF BF 7F 01 01 | ||
| 335 | 00 | 0 | 画像データの終了 |
単色の大きな画像の単純な例は、GIF ファイルで使用される可変長 LZW 圧縮を示しています。
| コード | ピクセル | 注記 | |||
|---|---|---|---|---|---|
| いいえ。ニi | 価値Ni + 256 | 長さ(ビット) | このコードニi | 蓄積されたNi ( Ni + 1)/2 | N iを使用する関係は、コーディング テーブルがいっぱいになるまで、同じ色のピクセルにのみ適用されます。 |
| 0 | 100時間 | 9 | クリアコードテーブル | ||
| 1 | FFh | 1 | 1 | 256色パレットの最高インデックスとして選択された左上のピクセルの色 | |
| 2 | 102時間 | 2 | 3 | ||
| 3⋮255 | 103時間⋮1FF時間 | 3⋮255 | 6⋮32640 | 最後の9ビットコード | |
| 256⋮767 | 200時間⋮3FF時間 | 10 | 256⋮767 | 32896⋮294528 | 最後の10ビットコード |
| 768⋮1791 | 400時間⋮7FF時間 | 11 | 768⋮1791 | 295296⋮1604736 | 最後の11ビットコード |
| 1792⋮3839 | 800時間⋮FFFh | 12 | 1792⋮3839 | 1606528⋮7370880 | コードテーブルがいっぱい |
| ⋮ | FFFh | 3839 | 最大コードは、同じ色のピクセルが複数ある場合に繰り返されることがあります。全体的なデータ圧縮は漸近的に3839 × に近づきます。8/12 = 2559+1/3 | ||
| 101時間 | 画像データの終了 | ||||
表示されるコード値はバイトにパックされ、さらに最大255バイトのブロックにパックされます。画像データのブロックは、後続のバイト数を宣言するバイトで始まります。画像の最後のデータブロックは、ブロック長が0のバイトで示されます。

GIF仕様では、GIFファイルの論理画面内の各画像について、インターレース(つまり、データブロック内のラスターラインの順序が連続していない)であることを指定できます。これにより、画像全体が描画される前に、画像の一部を表示して認識することが可能になります。
インターレース画像は上から下まで 8 ピクセルの高さのストリップに分割され、画像の行は次の順序で表示されます。
各ライン内のピクセルはインターレースではなく、左から右へ連続して表示されます。非インターレース画像と同様に、1つのラインのデータと次のラインのデータの間には途切れがありません。画像がインターレースであることを示すビットは、対応する画像記述子ブロックに設定されます。

GIF はアニメーション メディアとして設計されたわけではありませんが、複数の画像を 1 つのファイルに保存できることから、当然、アニメーション シーケンスのフレームを保存するためにこの形式を使用することが示唆されました。アニメーションを表示できるようにするために、GIF89a 仕様では、ファイル内の画像 (フレーム) を時間遅延でペイントして、ビデオ クリップを形成できるグラフィック コントロール拡張機能 (GCE)が追加されました。アニメーション GIF 内の各フレームは、フレームが描画された後の時間遅延を指定する独自の GCE によって導入されます。ファイルの先頭のグローバル情報は、既定ですべてのフレームに適用されます。データはストリーム指向であるため、各 GCE の開始のファイル オフセットは、先行するデータの長さによって異なります。各フレーム内では、LZW コード化されたイメージ データが最大 255 バイトのサブブロックに配置されます。各サブブロックのサイズは、その直前のバイトによって宣言されます。
デフォルトでは、アニメーションはフレームのシーケンスを一度だけ表示し、最後のフレームが表示されると停止します。アニメーションをループさせるために、Netscape は1990 年代にアプリケーション拡張ブロック (ベンダーがアプリケーション固有の情報を GIF ファイルに追加できるようにすることを目的としていた) を使用して Netscape アプリケーション ブロック (NAB) を実装しました。[ 39 ]このブロックは、アニメーション フレームのシーケンスの直前に配置され、フレームのシーケンスを再生する回数 (1~65535 回) または連続して繰り返すかどうか (0 は永久にループすることを示す) を指定します。これらの繰り返しアニメーションのサポートは、Netscape Navigatorバージョン 2.0 で初めて登場し、その後他のブラウザーに広がりました。[ 40 ]現在ではほとんどのブラウザーが NAB を認識してサポートしていますが、厳密には GIF89a 仕様の一部ではありません。
次の例は、記事のインフォボックスに(サムネイルとして)表示される アニメーション ファイルRotating earth (large).gifの構造を示しています。
| バイト番号(16進数) | 16進数 | テキストまたは値 | 意味 |
|---|---|---|---|
| 0 | 47 49 46 38 39 61 | GIF89a | 論理画面記述子 |
| 6 | 90 01 | 400 | ピクセル単位の幅 |
| 8 | 90 01 | 400 | 高さ(ピクセル単位) |
| あ | F7 | GCTは解像度3 × 8ビット/プライマリ で256色に対応します。 | |
| B | 00 | 0 | 背景色: #000000、黒 |
| C | 00 | 0 | デフォルトのピクセルアスペクト比、0:0 |
| D | 00 | グローバルカラーテーブル | |
| ⋮ | |||
| 30D | 21 | '!' | 拡張ブロック(ASCII感嘆符で始まる'!') |
| 30E | FF | アプリケーション拡張 | |
| 30階 | 0B | 11 | アプリケーション名と検証バイトを含むブロックのサイズ(常に 11) |
| 310 | 4E 45 54 53 43 41 50 45 32 2E 30 | ネットスケープ2.0 | 8バイトのアプリケーション名と3つの検証バイト |
| 31B | 03 | 3 | 次のサブブロックのバイト数 |
| 31C | 01 | 1 | 現在のデータ サブブロックのインデックス(NETSCAPE ブロックの場合は常に 1) |
| 31D | FF FF | 65535 | 符号なし繰り返し回数 |
| 31階 | 00 | アプリケーション拡張ブロックのサブブロックチェーンの終わり | |
| 320 | 21 | '!' | 拡張ブロック(ASCII感嘆符で始まる'!') |
| 321 | F9 | フレーム #1 のグラフィック コントロール拡張 | |
| 322 | 04 | 4 | 現在のサブブロック内のバイト数(4) |
| 323 | 04 | 000..... ...001.. ......0. .......0 | 予約済み、下位5ビットはビットフィールド破棄方法1: 破棄しないユーザー入力なし透明色、0は指定なしを意味する |
| 324 | 09 00 | 9 | フレーム遅延: 次のフレームを描画する前に 0.09 秒の遅延 |
| 326 | FF | 透明色インデックス(このフレームでは未使用) | |
| 327 | 00 | グラフィック制御拡張ブロックのサブブロックチェーンの終了 | |
| 328 | 2C | ',' | 画像記述子(ASCIIコンマ0x2Cで導入',') |
| 329 | 00 00 00 00 | (0, 0) | 論理画面内の画像の北西隅の位置: (0, 0) |
| 32D | 90 01 90 01 | (400、400) | フレームの幅と高さ: 400 × 400 ピクセル |
| 331 | 00 | 0 | ローカルカラーテーブル: 0 はなし、インターレースなしを意味します |
| 332 | 08 | 8 | フレーム#1の画像データの最小LZWコードサイズ |
| 333 | FF | 255 | 次のサブブロック内のLZW画像データのバイト数: 255バイト |
| 334 | ... | <画像データ> | 画像データ、255バイト |
| 433 | FF | 255 | 次のサブブロック内のLZW画像データのバイト数、255バイト |
| 434 | ... | <画像データ> | 画像データ、255バイト |
| ⋮ | 次のブロックでも繰り返します | ||
| 92C0 | 00 | このフレームのサブブロックチェーンの終了 | |
| 92C1 | 21 | '!' | 拡張ブロック(ASCII感嘆符で始まる'!') |
| 92C2 | F9 | フレーム #2 のグラフィック コントロール拡張 | |
| ⋮ | 次のフレームを繰り返す | ||
| エダブド | 21 | '!' | 拡張ブロック(ASCII感嘆符で始まる'!') |
| 枝部 | F9 | フレーム #44 のグラフィック コントロール拡張 | |
| ⋮ | フレーム#44の画像情報とデータ | ||
| F48F5 | 3B | トレーラー: ファイルの最後のバイト。EOF を示す。 |
各フレームのアニメーション遅延は、GCEで100分の1秒単位で指定されます。画像記述子は画像全体ではなく、再スキャンする小さな矩形を定義できるため、フレームがディスプレイのピクセルの一部のみを書き換えるだけで済む場合、ある程度のデータ節約が可能です。アニメーションGIFをサポートしていないブラウザやその他のディスプレイでは、通常、最初のフレームのみが表示されます。
アニメーション GIF ファイルのサイズと色の品質は、作成に使用したアプリケーションによって大きく異なります。ファイル サイズを最小化するための戦略としては、すべてのフレームに共通のグローバル カラー テーブルを使用する (各フレームの完全なローカル カラー テーブルではなく)、連続するフレームでカバーされるピクセルの数を最小化する (あるフレームから次のフレームに変化するピクセルのみが後のフレームに含まれるようにする) などがあります。より高度な手法では、既存の LZW 辞書 (非可逆圧縮の一種) に適合するように色のシーケンスを変更します。一連の独立したフレーム画像を単純に合成アニメーションにまとめると、ファイル サイズが大きくなる傾向があります。既存の GIF のファイル サイズを最小化するツールが用意されています。
メタデータは、GIFファイル内にコメントブロック、プレーンテキストブロック、またはアプリケーション固有のアプリケーション拡張ブロックとして保存できます。多くのグラフィックエディターでは、画像の生成に使用されたデータを非公式のアプリケーション拡張ブロックに格納することで、後から編集できるようにしています。
これらの方法はすべて、技術的にはメタデータをサブブロックに分割して、アプリケーションがメタデータ ブロックの内部構造を知らなくてもそのブロック内を移動できるようにする必要があります。
Extensible Metadata Platform (XMP) メタデータ標準では、GIFファイルにXMPデータを含めるための非公式ながら現在では広く普及している「XMPデータ」アプリケーション拡張ブロックが導入されました。[ 41 ] XMPデータはNUL文字を含まないUTF-8でエンコードされているため、データ内に0バイトは存在しません。データを正式なサブブロックに分割するのではなく、拡張ブロックは「マジックトレーラー」で終了し、データをサブブロックとして扱うアプリケーションを、サブブロックチェーンの終了を示す最後の0バイトへと誘導します。
1977年と1978年に、ジェイコブ・ジヴとアブラハム・レンペルは、現在LZ77とLZ78と総称される、新しいクラスのロスレスデータ圧縮アルゴリズムに関する2本の論文を発表しました。1983年、テリー・ウェルチはLZ78の高速版を開発し、レンペル・ジヴ・ウェルチ(LZW)と名付けました。[ 42 ] [ 43 ]
ウェルチは1983年6月にLZW法の特許を出願した。その結果得られた特許US4558302 [ 44 ]は1985年12月に付与され、スペリー社に譲渡された。スペリー社はその後1986年にバローズ社と合併してユニシス社を設立した[ 42 ]。さらにイギリス、フランス、ドイツ、イタリア、日本、カナダでも特許を取得した。
上記の特許に加えて、ウェルチの 1983 年の特許には、それに影響を与えた他のいくつかの特許の引用も含まれています。
1984年6月、ウェルチによる論文がIEEE誌に掲載され、初めてLZW技術が公表された。[ 49 ] LZWは人気のデータ圧縮技術となり、特許が認められると、ユニシスは100社以上の企業とライセンス契約を結んだ。[ 42 ] [ 50 ]
LZWの人気を受けて、CompuServeは1987年に開発したGIFの圧縮技術としてLZWを採用した。当時、CompuServeはこの特許の存在を知らなかった。[ 42 ] Unisysは、GIFのバージョンがLZW圧縮技術を使用していることを知り、1993年1月にCompuServeとライセンス交渉に入った。その後の契約は1994年12月24日に発表された。[ 43 ] Unisysは、LZW特許を採用しているすべての大手商用オンライン情報サービス企業が、Unisysから妥当な価格でこの技術のライセンスを取得することを期待しているが、オンラインサービスで使用するものも含め、非商用、非営利のGIFベースのアプリケーションについては、ライセンスや料金の支払いを要求しないと述べた。[ 50 ]
この発表の後、CompuServeとUnisysに対する非難が広がり、多くのソフトウェア開発者がGIFの使用をやめると脅した。1995年には、GIFの代替としてPNG形式(下記参照)が開発された。 [ 42 ] [ 43 ] [ 49 ]しかし、ウェブブラウザやその他のソフトウェアのメーカーからPNG形式へのサポートを得るのは困難で、PNGの人気は徐々に高まったものの、GIFを置き換えることはできなかった。[ 42 ]そのため、LZW圧縮を使用しないGIFのバリエーションが開発された。例えば、Eric S. Raymondのgiflibをベースにしたlibungifライブラリは、データ形式に準拠しながらも圧縮機能を回避し、UnisysのLZW特許の使用を回避したGIFの作成を可能にしている。[ 51 ] 2001年のDr. Dobbの論文では、ランレングス符号化機構で十分に圧縮できるデータを、特許を侵害することなくLZW互換符号化する方法が説明されている。[ 52 ]
1999年8月、ユニシスはライセンス制度の詳細を変更し、特定の非営利および個人ウェブサイトの所有者に対し、5,000ドルまたは7,500ドルの一時ライセンス料を支払うことでライセンスを取得できるオプションを発表しました。[ 53 ]ライセンスソフトウェアを使用してGIFを生成したウェブサイト所有者やその他のGIFユーザーには、このようなライセンスは必須ではありませんでした。しかし、ユニシスは、ウェブサイトでGIFを使用したことで5,000ドルの罰金を請求されたり訴訟を起こされたりすると信じ込んでいるユーザーからの数千件ものオンライン攻撃や中傷メールにさらされました。[ 54 ]数百の非営利団体、学校、政府に無償ライセンスを提供していたにもかかわらず、ユニシスは全く良い評判を得ることができず、1999年に「すべてのGIFを燃やせ」キャンペーンを開始したプログラミング自由連盟(League for Programming Freedom )などの個人や組織から非難され続けました。 [ 55 ] [ 56 ]
米国のLZW特許は2003年6月20日に失効した。[ 57 ]英国、フランス、ドイツ、イタリアの対応する特許は2004年6月18日に失効し、日本の特許は2004年6月20日に失効し、カナダの特許は2004年7月7日に失効した。[ 57 ]その結果、ユニシスはLZW技術の改良に関するさらなる特許と特許出願を保有しているが、[ 57 ] LZW自体(そしてGIF)は2004年7月から自由に使用できるようになった。[ 58 ]
このセクションは更新が必要です。理由は、PNGのサポート/使用、最新の使用法、および代替手段です。(2025年8月) |
ポータブルネットワークグラフィックス(PNG)は、UnisysのLZW圧縮技術の特許侵害を回避するために、GIFの代替として設計されました。[ 42 ] PNGはGIFよりも優れた圧縮率と多くの機能を提供しますが、[ 59 ]アニメーションが唯一の大きな例外です。PNGは、トゥルーカラー画像とアルファ透過性が求められる 場合には、GIFよりも適しています。
PNG形式のサポートは徐々に進みましたが、新しいウェブブラウザはPNGをサポートしています。Internet Explorerの古いバージョンはPNGのすべての機能をサポートしていません。バージョン6以前では、 Microsoft固有のHTML拡張機能を使用せずにアルファチャンネルの透明化をサポートしていません。 [ 60 ] PNG画像のガンマ補正はバージョン8より前ではサポートされておらず、以前のバージョンではこれらの画像の表示に誤った色合いが生じる可能性があります。[ 61 ]
同一の8ビット(またはそれ以下)の画像データの場合、PNGファイルは、PNGエンコードで使用されるより効率的な圧縮技術により、通常、同等のGIFファイルよりも小さくなります。[ 62 ] GIFの完全なサポートは、主に複雑なキャンバス構造によって複雑になっていますが、これがコンパクトなアニメーション機能を可能にしています。
動画は、ウェブ上でのGIFの一般的な使用において生じる多くの問題を解決します。例えば、ファイルサイズが大幅に小さいこと、 8ビットカラー制限を克服できること、インターフレームコーディングによるフレーム処理と圧縮率の向上などが挙げられます。ウェブブラウザでGIF形式がほぼ普遍的にサポートされていること、そしてHTML標準では動画が公式にサポートされていないことが、ウェブ上で短い動画のようなファイルを表示する目的でGIFが注目を集めるきっかけとなりました。
<video>、一部のウェブサイトではビデオタグのループバージョンが使用されています。これにより、GIFのような見た目になりながら、圧縮された動画のサイズと速度の利点を享受できます。2014年4月、4chanはサイズが3MB以下で長さが2分以下の無音WebM動画のサポートを追加しました。 [ 76 ] [ 77 ]また、2014年10月には、ImgurはサイトにアップロードされたGIFファイルをH.264動画に変換し、HTMLプレーヤーへのリンクに.gifv拡張子が付いた実際のファイルのような外観を与えるようになりました。[ 78 ] [ 79 ]
2016年1月、TelegramはすべてのGIFをMPEG-4ビデオに再エンコードし始めました。これにより「同じ画質で最大95%のディスク容量を削減」できます。[ 80 ]