Самый маленький прозрачный GIF занимает 43 байта.
Вот он целиком. Выберите любой байт, чтобы узнать, что он делает, а затем скопируйте файл, скачайте его, подключите по прямой ссылке или отдавайте из своего кода.

Что делает каждый байт
GIF — это последовательность блоков. В этом файле их семь, и каждый цвет на странице соответствует одному из них. Выберите байт или блок, чтобы прочитать описание. Числа хранятся в порядке little-endian: младший байт идёт первым, поэтому 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 | Упакованные флаги | Четыре настройки, втиснутые в один байт. Старший бит говорит, что далее следует глобальная таблица цветов; три младших бита задают её размер. |
| 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 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 | Терминатор блока | Подблок нулевой длины, закрывающий блок. |
| Трейлер Один байт, отмечающий конец файла. | ||
| 3B | Трейлер | 0x3B («;») завершает файл. |
Внутри упакованных байтов
Каждый из трёх байтов хранит несколько мелких настроек. Бит 7 — крайний слева.
0x800x010x00Как два байта хранят один пиксель
При минимальном размере кода 2 декодер читает 3-битные коды. Код 4 очищает таблицу, код 5 завершает изображение, а коды с 0 по 3 — это элементы палитры. Байты 44 01 читаются начиная с младшего бита:
0x44 010001000x01 00000001
- 001100 = 4Очистка: начать с новой таблицы
- 000000 = 0Пиксель: элемент палитры 0
- 101101 = 5Конец изображения
- 0000000 Неиспользуемые биты выравнивания
Большие изображения используют тот же приём: каждый новый код обозначает серию на один пиксель длиннее предыдущей, поэтому прозрачный GIF 1000×1000 занимает всего 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 байт показывает, насколько расходятся движки.
Проверено 23 сентября 2026 г.: Chromium 153.0.8010.12, Firefox 155.0, WebKit 26.6, Pillow 12.2.0.
GIF любого размера
Прозрачный или залитый одним цветом, от 1×1 до 65535×65535. Генерируется в вашем браузере, ничего никуда не загружается.
Прямые ссылки
Ссылайтесь на эти файлы напрямую с любого сайта, из письма или приложения. Они раздаются с edge-серверов 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 - Сводка для ИИ-агентов
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 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);
Мы запустили этот пример и сравнили байты, которые он вернул. Открыть страницу
Для чего он нужен
- Пиксели отслеживания и маяки (beacons): сервер записывает запрос в лог и отвечает самым маленьким корректным изображением.
- Заглушки для изображений с ленивой загрузкой, чтобы тег
imgбыл корректным до того, как придёт настоящий источник. - Распорки фиксированного размера в HTML-письмах, где поддержка CSS неполная.
- Тесты и моки, которым нужно настоящее изображение, но без отдельного файла.
Пиксели отслеживания менее надёжны, чем кажется
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, если каждый запрос должен доходить до вашего сервера.