最小の透明 GIF は 43 バイトです。
これで全部です。バイトを選ぶとその役割が表示されます。ファイルをコピー、ダウンロード、直リンクしたり、自分のコードから配信したりできます。

各バイトの役割
GIF はブロックの並びでできています。このファイルには 7 つのブロックがあり、このページの色はそれぞれどれかのブロックに対応しています。バイトやブロックを選ぶと説明が表示されます。 数値はリトルエンディアンで格納されます。下位バイトが先に来るので、01 00 は 1 を表します。
| バイト | フィールド | 意味 |
|---|---|---|
| ヘッダー これが GIF であることと、どのバージョンの形式かをデコーダーに伝えます。 | ||
| 47 49 46 | シグネチャ | ASCII 文字の「GIF」。すべての GIF ファイルはこれで始まります。 |
| 38 39 61 | バージョン | 「89a」。透明にするには 89a が必要です。87a にはグラフィック制御拡張がありません。 |
| 論理画面記述子 キャンバスのサイズと、カラーテーブルの構成。 | ||
| 01 00 | キャンバスの幅 | 1 px。 |
| 01 00 | キャンバスの高さ | 1 px。 |
| 80 | パックフラグ | 4 つの設定を 1 バイトに詰め込んでいます。最上位ビットはグローバルカラーテーブルが続くことを示し、下位 3 ビットがそのサイズを表します。 |
| 00 | 背景色インデックス | パレットの 0 番。ブラウザーはこれを無視し、画像の背後にあるものを表示します。 |
| 00 | ピクセルアスペクト比 | 0 は正方形のピクセルで、補正なしを意味します。 |
| グローバルカラーテーブル パレットです。ピクセルは色そのものではなく、このリストへのインデックスを持ちます。 | ||
| FF FF FF | パレットエントリ | 赤・緑・青が 1 バイトずつ:#ffffff。GIF のテーブルは最小でも 2 エントリです。 |
| 00 00 00 | パレットエントリ | 赤・緑・青が 1 バイトずつ:#000000。GIF のテーブルは最小でも 2 エントリです。 |
| グラフィック制御拡張 GIF89a で追加された任意のブロック。ここではパレットの 0 番を透明にしています。 | ||
| 21 | 拡張導入子 | 0x21(「!」)は拡張ブロックの開始を示します。 |
| F9 | グラフィック制御ラベル | 0xF9 は、この拡張がグラフィック制御拡張であることを示します。 |
| 04 | ブロックサイズ | この後に 4 バイトの設定が続きます。 |
| 01 | パックフラグ | 最下位ビットが透明フラグです。オンなので、下の透明色インデックスが使われます。 |
| 00 00 | 遅延時間 | 0 × 1/100 秒。アニメーションでのみ意味があります。 |
| 00 | 透明色インデックス | パレットの 0 番は完全に透明として描画されます。 |
| 00 | ブロック終端子 | ブロックを閉じる長さ 0 のサブブロック。 |
| イメージ記述子 キャンバス上の画像の位置とサイズ。 | ||
| 2C | イメージ区切り子 | 0x2C(「,」)で画像が始まります。 |
| 00 00 | 左位置 | 画像はキャンバスの左端から 0 px の位置から始まります。 |
| 00 00 | 上位置 | 画像はキャンバスの上端から 0 px の位置から始まります。 |
| 01 00 | 画像の幅 | 1 px。 |
| 01 00 | 画像の高さ | 1 px。 |
| 00 | パックフラグ | ローカルカラーテーブルなし、インターレースなし。画像はグローバルパレットを使います。 |
| イメージデータ LZW で圧縮され、最大 255 バイトのサブブロックに分割されたピクセル。 | ||
| 02 | LZW 最小コードサイズ | 2。そのため圧縮コードは 3 ビット幅から始まります。 |
| 02 | サブブロックサイズ | この後に 2 バイトの圧縮データが続きます。 |
| 44 01 | 圧縮ピクセル | 最下位ビットから詰められた LZW コード。デコードの仕組みは下で説明しています。 |
| 00 | ブロック終端子 | ブロックを閉じる長さ 0 のサブブロック。 |
| トレーラー ファイルの終わりを示す 1 バイト。 | ||
| 3B | トレーラー | 0x3B(「;」)でファイルが終わります。 |
パックされたバイトの中身
3 つのバイトには、それぞれ小さな設定が複数入っています。ビット 7 が一番左です。
0x800x010x002 バイトで 1 ピクセルを表す仕組み
最小コードサイズが 2 の場合、デコーダーは 3 ビットのコードを読みます。コード 4 はテーブルをクリアし、コード 5 は画像を終了し、コード 0〜3 はパレットのエントリです。バイト 44 01 は最下位ビットから順に読みます:
0x44 010001000x01 00000001
- 001100 = 4クリア:新しいテーブルで開始
- 000000 = 0ピクセル:パレットの 0 番
- 101101 = 5画像の終わり
- 0000000 未使用のパディングビット
大きな画像も同じ仕組みです。新しいコードはそれぞれ直前より 1 ピクセル長い連続を表すので、1000×1000 の透明 GIF でもわずか 1,743 バイトで済みます。
もっと小さくできる?
できます。デコーダーがなくても許容する部分を削れば小さくなります。各バリアントを 3 つのブラウザーエンジンと Pillow に読み込ませ、何が描画されたかを記録しました。
| サイズ | バリアント | Chromium | Firefox | WebKit | Pillow |
|---|---|---|---|---|---|
| 43 | このページで扱う標準のファイル。 | 透明 | 透明 | 透明 | 透明 |
| 42 | トレーラーバイトなし。デコーダーはいずれにせよデータの終わりで止まります。 | 透明 | 透明 | 透明 | 透明 |
| 37 | パレットなし。それでも仕様上は正しく、デコーダーは独自のパレットを使ってよいことになっており、インデックス 0 はいずれにせよ透明です。 | 透明 | 透明 | 透明 | 透明 |
| 36 | パレットもトレーラーもなし。 | 透明 | 透明 | 透明 | 透明 |
| 35 | 透明ブロックなし。ピクセルはパレットの 0 番の色(白)で描画されます。 | 白 | 白 | 白 | 白 |
| 35 | 1987 年の形式。色を透明に指定する手段がありません。 | 白 | 白 | 白 | 白 |
| 34 | 透明ブロックはあるが、圧縮ピクセルがない。 | 透明 | 透明 | 透明 | エラー |
| 33 | 上と同じで、トレーラーもなし。 | 透明 | 透明 | 透明 | エラー |
| 29 | パレットも透明指定もなし。色は各エンジンがそれぞれ選びます。 | 黒 | 白 | 透明 | 黒 |
| 26 | 圧縮データがまったくない画像。 | 透明 | 透明 | 透明 | エラー |
| 14 | ヘッダー、キャンバスサイズ、トレーラーのみ。画像は含まれていません。 | 透明 | エラー | 透明 | エラー |
どこでも確実に動く必要があるなら 43 バイトを使いましょう。37 バイトも正しい GIF で、テストしたすべてのエンジンで透明になりました。それより小さいとデコーダーの寛容さ頼みになり、29 バイトのファイルではエンジンごとに結果が分かれます。
2026年9月23日 に Chromium 153.0.8010.12, Firefox 155.0, WebKit 26.6, Pillow 12.2.0 で確認。
任意のサイズで作る
透明または単色で、1×1 から 65535×65535 まで。ブラウザー内で生成するので、何もアップロードされません。
直リンクする
どのサイト、メール、アプリからでもこれらのファイルに直接リンクできます。Cloudflare のエッジから長いキャッシュ期間で配信され、CORS は誰にでも開放されています。
- 43 バイトのファイル
https://emptygif.com/1x1.gif - 任意サイズ、透明
https://emptygif.com/px/300x250.gif - 任意サイズ、単色
https://emptygif.com/px/300x250/ff5a1f.gif - JSON API:サイズ、base64、data URI
https://emptygif.com/api/gif?w=300&h=250 - 全スニペットの JSON
https://emptygif.com/snippets.json - AI エージェント向けの概要
https://emptygif.com/llms.txt
レスポンスヘッダー
HTTP/2 200
content-type: image/gif
content-length: 43
cache-control: public, max-age=31536000, immutable
access-control-allow-origin: *
cross-origin-resource-policy: cross-origin
timing-allow-origin: *例
<img src="https://emptygif.com/1x1.gif" width="1" height="1" alt="">
生成できるサイズは 1 辺 4096 px までです。大量のトラフィックがある場合は、ファイルをダウンロードして自分のサーバーでホストしてください。
自分のスタックから配信する
すぐに動くスニペットが 173 個あります。どれも指定したパスで image/gif のレスポンスを返します。上でサイズや色を変えた場合は、その GIF がスニペットに使われます。
JavaScript & TypeScript
Edge & serverless
- Cloudflare Workers
- Cloudflare Workers (Rust, workers-rs)
- Cloudflare Pages Functions
- Deno Deploy (deno serve)
- Vercel Functions
- Netlify Functions
- Netlify Edge Functions
- AWS Lambda (Node.js)
- AWS Lambda (Python)
- AWS Lambda (Go)
- AWS Lambda (Rust, lambda_http)
- AWS Lambda@Edge (CloudFront)
- Google Cloud Run functions (Node.js)
- Google Cloud Run functions (Python)
- Firebase Cloud Functions + Hosting
- Azure Functions (Node.js v4 model)
- Fastly Compute (JavaScript)
Python
JVM
PHP
Elixir, Erlang & Gleam
Functional languages
C, C++ & systems languages
Swift, Dart & other languages
Web servers & proxies
Command line & one-liners
Express JavaScript
import express from 'express';
const GIF = Buffer.from('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==', 'base64');
const app = express();
app.get('/pixel.gif', (req, res) => {
res.set('Cache-Control', 'no-store');
res.type('gif').send(GIF);
});
app.listen(8080);
このスニペットは実行し、返されたバイト列を照合しました。 ページを開く
用途
- トラッキングピクセルやビーコン:サーバーはリクエストを記録し、最小の有効な画像を返します。
- 遅延読み込み画像のプレースホルダー。本来の画像ソースが届く前から
imgタグを有効な状態にできます。 - CSS のサポートがまちまちな HTML メールでの、固定サイズのスペーサー。
- 画像ファイルを同梱せずに本物の画像が必要なテストやモック。
トラッキングピクセルは見た目ほど当てになりません
Apple Mail は「メールプライバシー保護」がオンのとき、リモート画像をプロキシ経由で先読みするため、「開封」が人によるものとは限りません。Gmail も独自のプロキシ経由で画像を取得してキャッシュします。多くのクライアントはデフォルトでリモート画像をブロックします。ページのアナリティクスには、画像よりも navigator.sendBeacon() や 204 No Content レスポンスのほうが適していることがよくあります。
よくある質問
- ピクセルがあるのに、なぜ「空」なのですか?
- GIF には最低 1 ピクセルが必要です。このファイルは 1×1 で、唯一の色が透明に指定されているため、何も表示されません。
- 43 バイトのファイルは仕様上正しいですか?
- はい。GIF89a 仕様に厳密に従っており、上の表のすべてのエンジンで透明に描画されます。
- PNG や WebP ではなく、なぜ GIF なのですか?
- 最小の透明 PNG よりも小さく、過去 35 年のあらゆるブラウザー、メールクライアント、画像ライブラリで読めるからです。
- data URI とファイル、どちらを使うべきですか?
- data URI はリクエストを 1 回減らせるので、プレースホルダーや CSS に向いています。トラッキングピクセルのようにリクエストそのものが目的の場合は、ファイルかエンドポイントが必要です。
- Content-Type は何を送ればよいですか?
image/gifです。すべてのリクエストをサーバーに届かせる必要がある場合はCache-Control: no-storeも付けてください。