emptygif
Язык: Русский

Самый маленький прозрачный GIF занимает 43 байта.

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

GIF в 43 байта, увеличенный: один прозрачный пиксель
0000
0010
0020
Скачать 1×1.gif

R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

Что делает каждый байт

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Минимальный размер кода LZW2, поэтому сжатые коды поначалу имеют ширину 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 Неиспользуемые биты выравнивания

Большие изображения используют тот же приём: каждый новый код обозначает серию на один пиксель длиннее предыдущей, поэтому прозрачный GIF 1000×1000 занимает всего 1 743 байт.

Можно ли меньше?

Да, если выбросить части, без которых декодеры обходятся. Мы прогнали каждый вариант через три браузерных движка и Pillow и записали, что они нарисовали.

РазмерВариантChromiumFirefoxWebKitPillow
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. Генерируется в вашем браузере, ничего никуда не загружается.

Заливка
Популярные размеры

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);

Мы запустили этот пример и сравнили байты, которые он вернул. Открыть страницу

Для чего он нужен

  • Пиксели отслеживания и маяки (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, если каждый запрос должен доходить до вашего сервера.