Формат GIF
GIF хранит не цвета пикселей, а номера в палитре, и мест в этой палитре ровно 256. Изображение сжимается без потерь алгоритмом LZW, но сама палитра — это уже потеря: фотография перед сохранением приводится к двум с половиной сотням оттенков и покрывается характерной рябью. Прозрачность в формате есть, но однобитная: пиксель либо виден целиком, либо не виден вовсе, полутонов между ними не бывает.
Коротко о цифрах
- Палитра
- не более 256 цветов, то есть 8 бит на пиксель
- Сжатие
- LZW, без потерь — но приведение к палитре потери уже внесло
- Прозрачность
- один бит: пиксель либо виден, либо нет, полутонов нет
- Анимация в PDF
- не переносится: на страницу попадает один кадр
- У нас
- принимается при сборке PDF, в документ уходит как PNG
Палитра и почему на фотографиях она видна
Полноцветное изображение содержит миллионы оттенков. Сохраняя его в GIF, программа выбирает 256 наиболее подходящих и заменяет каждый пиксель ближайшим из выбранных. Плавный градиент неба при этом распадается на видимые полосы. Чтобы их скрыть, кодировщик подмешивает дизеринг — шахматный узор из двух соседних цветов, который издали читается как промежуточный оттенок, а вблизи выглядит как зернистость.
Зато на плоской графике формат ведёт себя отлично: логотип, схема, пиксельная иконка обходятся десятком цветов, и LZW сжимает такие данные очень плотно. Именно поэтому GIF пережил тридцать лет — не как формат фотографий, а как формат простых картинок и коротких зацикленных роликов.
Анимация и один кадр в PDF
- Анимированный GIF — это последовательность кадров с задержками и правилами наложения друг на друга, всё в одном файле.
- PDF — формат неподвижных страниц: положить туда движущуюся картинку нельзя в принципе.
- Наш конвертер рисует изображение на канвасе, а канвас забирает один кадр — тот, что отображается в момент отрисовки. У только что загруженного файла это первый кадр.
- Поэтому анимация из десяти кадров превращается в одну страницу, а не в десять. Нужны все кадры — разложите ролик на отдельные картинки любым покадровым конвертером и загрузите их как обычные изображения.
Прозрачность в один бит
В палитре GIF один индекс можно объявить прозрачным. Никакой промежуточной прозрачности это не даёт: пиксель либо полностью прозрачен, либо полностью непрозрачен. На косой линии или скруглённом углу такая маска даёт рваный, ступенчатый край — его невозможно сгладить, потому что сглаживание требует полупрозрачных пикселей.
При переносе в PDF мы пересобираем картинку в PNG, и однобитная маска переносится честно: как была рваной, такой и останется. Если нужен аккуратный логотип с мягкими краями поверх страницы, исходник должен быть в PNG или WebP с полноценным альфа-каналом — переделать GIF задним числом нельзя, данных о полутонах в нём просто нет.
Частые вопросы
Почему из анимированного GIF получилась одна неподвижная страница?
PDF не умеет хранить анимацию, там есть только неподвижные страницы. Конвертер берёт кадр, отрисованный на канвасе, — для только что загруженного файла это первый кадр ролика.
Как сделать PDF из всех кадров анимации?
Разберите ролик на отдельные картинки покадровым конвертером, сохраните их в PNG и загрузите как обычный набор изображений. Порядок страниц потом задаётся перетаскиванием миниатюр.
Почему фотография в GIF выглядит зернистой?
Она приведена к палитре из 256 цветов, а недостающие оттенки имитированы дизерингом — шахматным чередованием двух соседних цветов. Вблизи этот узор и читается как зерно.
Края логотипа из GIF получились рваными. Это можно исправить?
Не из самого GIF: его прозрачность однобитная, полутоновых данных на краях в файле нет. Нужен исходник в PNG или WebP с настоящим альфа-каналом, иначе сгладить нечем.