emptygif
语言: 简体中文

最小的透明 GIF 只有 43 字节。

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

放大后的 43 字节 GIF:一个透明像素
0000
0010
0020
下载 1×1.gif

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

每个字节的作用

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 字节的子块。
02LZW 最小码长2,因此压缩码从 3 位宽开始。
02子块大小后面跟着 2 字节的压缩数据。
44 01压缩像素从最低位开始打包的 LZW 码。下方展示了它们如何解码。
00块终止符一个长度为零的子块,用来结束该块。
文件尾 标记文件结束的一个字节。
3B文件尾0x3B(“;”)结束文件。

打包字节的内部

这三个字节各自存储了几项小设置。第 7 位在最左边。

逻辑屏幕描述符 0x80
1存在全局颜色表
000颜色分辨率
0调色板按重要性排序
000表大小:2^(n+1) 项
图形控制扩展 0x01
000保留
000处置方法
0等待用户输入
1启用透明
图像描述符 0x00
0存在局部颜色表
0隔行
0调色板按重要性排序
00保留
000局部表大小

两个字节如何容纳一个像素

最小码长为 2 时,解码器读取 3 位的码。码 4 清空码表,码 5 结束图像,码 0 到 3 对应调色板项。字节 44 01 从最低位开始读取:

0x44 010001000x01 00000001

  1. 001100 = 4清除:从全新的码表开始
  2. 000000 = 0像素:调色板第 0 项
  3. 101101 = 5图像结束
  4. 0000000 未使用的填充位

更大的图像也用同样的技巧:每个新码代表比上一个多一个像素的连续像素,所以 1000×1000 的透明 GIF 只需 1,743 字节。

还能更小吗?

可以,只要去掉解码器能容忍缺失的部分。我们把每个变体交给三个浏览器引擎和 Pillow,并记录它们画出的结果。

大小变体ChromiumFirefoxWebKitPillow
43本页的标准文件。透明透明透明透明
42没有文件尾字节。解码器反正会在数据结束处停止。透明透明透明透明
37完全没有调色板。仍然合法:规范允许解码器使用自己的调色板,而且索引 0 本来就是透明的。透明透明透明透明
36没有调色板,也没有文件尾。透明透明透明透明
35没有透明块:像素以调色板颜色 0(白色)绘制。白色白色白色白色
351987 年的格式。它无法把颜色标记为透明。白色白色白色白色
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。在你的浏览器中生成,不会上传任何内容。

填充
常用尺寸

1×1 · 43 字节

下载 GIF

在你的技术栈中提供它

173 个可直接运行的代码片段。选一个适合你的:每个都会在你指定的路径返回 image/gif 响应。如果你在上面修改了尺寸或颜色,代码片段会使用那个 GIF。

Elixir, Erlang & Gleam

Express JavaScript

安装
npm i express
文件
server.mjs
运行
node server.mjs
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