Формат JPG (JPEG)
JPEG режет картинку на квадраты 8×8 пикселей и описывает каждый набором частот, отбрасывая те, что глаз почти не замечает. Отсюда три следствия: файл выходит в разы легче исходных пикселей, прозрачности в нём нет вовсе, а каждое пересохранение отбрасывает новую порцию данных поверх уже отброшенной. Внутри PDF у формата отдельный фильтр DCTDecode, поэтому снимок переносится в документ потоком байтов, а не перерисовывается заново.
Коротко о цифрах
- Стандарт
- ISO/IEC 10918-1, принят в 1992 году
- Единица сжатия
- блок 8×8 пикселей, дискретное косинусное преобразование
- Прозрачность
- не поддерживается: альфа-канала в формате нет
- Фильтр в PDF
- DCTDecode — поток JPEG кладётся в документ как есть
- Что делает наш конвертер
- пересобирает JPEG через канвас с качеством 0,95 ради поворота по EXIF
Что именно теряется
Квадрат 8×8 превращается в 64 коэффициента: первый описывает среднюю яркость блока, остальные — всё более мелкие детали. Ползунок качества управляет тем, насколько грубо эти коэффициенты округляются. При 95 округление почти не заметно, при 40 мелкие коэффициенты обнуляются целыми группами, и на границе блоков появляется ступенька — та самая «квадратность» на пережатых картинках.
Отдельно страдает цвет. Глаз различает яркость гораздо точнее оттенка, поэтому кодировщик обычно записывает цветовые каналы вчетверо реже яркостного. На фотографии это невидимо, а на красном тексте по белому фону или на тонкой цветной линии — заметно сразу: контур расплывается, хотя буквы остались чёрными и резкими.
Прозрачности нет, и это не настройка
- В спецификации JPEG альфа-канала не предусмотрено: каждый пиксель обязан иметь цвет.
- Программа, которая «сохраняет JPG с прозрачностью», на деле заливает прозрачные места белым или чёрным.
- Наш компрессор изображений делает это явно: перед кодированием в JPEG под картинку подкладывается белый фон, иначе прозрачные пиксели вышли бы чёрными.
- Нужен прозрачный фон — берите PNG или WebP; JPEG для этого не чинится никакими настройками.
JPG внутри PDF
- В PDF есть фильтр DCTDecode, то есть JPEG хранится в документе своим родным потоком — распаковывать и переупаковывать его не нужно.
- Поэтому страница из снимка почти всегда весит примерно столько же, сколько сам снимок, плюс килобайты служебной структуры.
- Обратная операция не бесплатна: при экспорте PDF в JPG страница сначала рисуется на канвасе, а потом кодируется заново с качеством 0,9.
- У нас потолок канваса — 4096 пикселей по стороне: A4 при 300 DPI это 2480×3508 и проходит, а A3 в тех же 300 DPI потребовал бы 4961 и будет автоматически прижат примерно к 248 DPI.
Как мы собираем PDF из JPG
- Перетащите снимки в окно инструмента — они остаются в браузере, на сервер не уходит ни байта.
- Порядок страниц задаётся перетаскиванием миниатюр: имена вида IMG_0421 на слух не различаются, а картинки различаются.
- Каждый JPEG декодируется с учётом тега EXIF Orientation и пересобирается через канвас с качеством 0,95 — иначе снимок, сделанный вертикально, лёг бы на страницу боком.
- Если браузер не умеет применять этот тег, в документ уходят исходные байты файла без перекодирования.
- Выберите размер страницы: A4, Letter или «Авто», где лист принимает пропорции самого снимка.
Частые вопросы
Чем JPG отличается от JPEG?
Ничем: это один и тот же формат. Три буквы остались от MS-DOS, где расширение не могло быть длиннее трёх символов. Байты внутри одинаковые, переименование файла ничего не меняет.
Почему снимок портится, если несколько раз открыть и сохранить его?
Каждое сохранение — новый проход округления коэффициентов, и оно накладывается на результат предыдущего. Даже качество 95 при десятом пересохранении даёт видимую грязь на границах блоков, потому что потери не отменяются.
Можно ли сделать в JPG прозрачный фон?
Нет. Формат физически не хранит канал прозрачности, поэтому любой редактор заменит прозрачные области сплошным цветом. Если фон должен просвечивать, сохраняйте картинку в PNG или WebP.
PDF из фотографий получился тяжелее, чем сами фотографии. Почему?
Скорее всего, снимки были не JPEG. Файлы WebP, HEIC, BMP и GIF наш конвертер декодирует и вкладывает в документ как PNG без потерь, а лёгкое сжатие с потерями при этом теряется — отсюда рост.