最小的透明 GIF 只有 43 字节。
这就是它的全部。点选任意字节查看它的作用,然后复制文件、下载、外链,或用你自己的代码来提供它。

每个字节的作用
GIF 由一系列块组成。这个文件有七个块,本页的每种颜色都对应其中一个。选择一个字节或块即可查看说明。 数值以小端序存储:低字节在前,所以 01 00 表示 1。
| 字节 | 字段 | 含义 |
|---|---|---|
| 文件头 告诉解码器这是一个 GIF,以及应按哪个格式版本来解析。 | ||
| 47 49 46 | 签名 | ASCII 字母“GIF”。每个 GIF 文件都以它们开头。 |
| 38 39 61 | 版本 | “89a”。透明需要 89a;87a 没有图形控制扩展。 |
| 逻辑屏幕描述符 画布的尺寸,以及颜色表的设置方式。 | ||
| 01 00 | 画布宽度 | 1 像素。 |
| 01 00 | 画布高度 | 1 像素。 |
| 80 | 打包标志位 | 四项设置挤在一个字节里。最高位表示后面跟着全局颜色表;最低三位给出它的大小。 |
| 00 | 背景色索引 | 调色板第 0 项。浏览器会忽略它,直接显示图像后面的内容。 |
| 00 | 像素宽高比 | 0 表示方形像素,不做校正。 |
| 全局颜色表 调色板。像素存储的是指向这个列表的索引,而不是颜色本身。 | ||
| FF FF FF | 调色板项 | 红、绿、蓝各占一个字节:#ffffff。两项是 GIF 颜色表的最小尺寸。 |
| 00 00 00 | 调色板项 | 红、绿、蓝各占一个字节:#000000。两项是 GIF 颜色表的最小尺寸。 |
| 图形控制扩展 GIF89a 新增的可选块。这里它让调色板第 0 项变为透明。 | ||
| 21 | 扩展引导符 | 0x21(“!”)表示接下来是一个扩展块。 |
| F9 | 图形控制标签 | 0xF9 表示这个扩展是图形控制扩展。 |
| 04 | 块大小 | 后面跟着 4 字节的设置。 |
| 01 | 打包标志位 | 最低位是透明标志。它已开启,因此会使用下面的透明色索引。 |
| 00 00 | 延迟 | 0 个百分之一秒。只对动画有意义。 |
| 00 | 透明色索引 | 调色板第 0 项绘制为完全透明。 |
| 00 | 块终止符 | 一个长度为零的子块,用来结束该块。 |
| 图像描述符 图像在画布上的位置和大小。 | ||
| 2C | 图像分隔符 | 0x2C(“,”)表示一个图像开始。 |
| 00 00 | 左偏移 | 图像从距画布左边缘 0 像素处开始。 |
| 00 00 | 上偏移 | 图像从距画布上边缘 0 像素处开始。 |
| 01 00 | 图像宽度 | 1 像素。 |
| 01 00 | 图像高度 | 1 像素。 |
| 00 | 打包标志位 | 没有局部颜色表,非隔行。图像使用全局调色板。 |
| 图像数据 像素数据,经 LZW 压缩,并拆分成每个最多 255 字节的子块。 | ||
| 02 | LZW 最小码长 | 2,因此压缩码从 3 位宽开始。 |
| 02 | 子块大小 | 后面跟着 2 字节的压缩数据。 |
| 44 01 | 压缩像素 | 从最低位开始打包的 LZW 码。下方展示了它们如何解码。 |
| 00 | 块终止符 | 一个长度为零的子块,用来结束该块。 |
| 文件尾 标记文件结束的一个字节。 | ||
| 3B | 文件尾 | 0x3B(“;”)结束文件。 |
打包字节的内部
这三个字节各自存储了几项小设置。第 7 位在最左边。
0x800x010x00两个字节如何容纳一个像素
最小码长为 2 时,解码器读取 3 位的码。码 4 清空码表,码 5 结束图像,码 0 到 3 对应调色板项。字节 44 01 从最低位开始读取:
0x44 010001000x01 00000001
- 001100 = 4清除:从全新的码表开始
- 000000 = 0像素:调色板第 0 项
- 101101 = 5图像结束
- 0000000 未使用的填充位
更大的图像也用同样的技巧:每个新码代表比上一个多一个像素的连续像素,所以 1000×1000 的透明 GIF 只需 1,743 字节。
还能更小吗?
可以,只要去掉解码器能容忍缺失的部分。我们把每个变体交给三个浏览器引擎和 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="">
生成的尺寸每边最多 4096 像素。如果流量很大,请下载文件并自行托管。
在你的技术栈中提供它
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标签在真实图片地址到位之前就是合法的。 - HTML 邮件中的固定尺寸间隔图,因为邮件里的 CSS 支持参差不齐。
- 需要真实图片、又不想附带图片文件的测试和 mock。
跟踪像素没有看起来那么可靠
开启“邮件隐私保护”后,Apple Mail 会通过代理预加载远程图片,所以一次“打开”可能根本不是真人。Gmail 也会通过自己的代理获取并缓存图片。许多客户端默认屏蔽远程图片。做页面分析时,navigator.sendBeacon() 或 204 No Content 响应通常比图片更合适。
常见问题
- 明明有一个像素,为什么叫“空”?
- GIF 至少要有一个像素。这个是 1×1,唯一的颜色被标记为透明,所以什么都不显示。
- 这个 43 字节的文件合法吗?
- 合法。它完全遵循 GIF89a 规范,上表中的每个引擎都把它绘制为透明。
- 为什么用 GIF,而不是 PNG 或 WebP?
- 它比最小的透明 PNG 还小,而且过去 35 年里的所有浏览器、邮件客户端和图像库都能读取它。
- 应该用 data URI 还是文件?
- data URI 能省掉一次请求,适合占位图和 CSS。如果请求本身才是目的(比如跟踪像素),就需要文件或接口。
- 应该发送哪个 Content-Type?
image/gif。如果每个请求都必须到达你的服务器,再加上Cache-Control: no-store。