Как сжать фото онлайн без видимой потери качества
Совсем без потерь фотографию сжать нельзя: и JPEG, и WebP выбрасывают часть данных по устройству формата, а форматы без потерь для снимка почти всегда дают файл крупнее исходного. Реалистичная задача звучит иначе — без видимой потери. Инструмент ищет самое высокое качество, которое укладывается в заданный вес, в пределах шкалы от 25 до 95, и не трогает файл, который уже и так помещается.
Коротко о цифрах
- Диапазон качества
- автоподбор ходит по 25–95, то есть по 71 значению; ручной ползунок начинается с 30
- Бюджет подбора
- 7 кодирований — ровно столько, чтобы бисекция сошлась к одному значению
- Что значит «без потери» для JPEG
- качество ближе к верхней границе и без уменьшения стороны
- Защита от двойного сжатия
- файл, который уже укладывается в цель, возвращается как есть
- Проверка ориентации
- пробный JPEG 2×1 с меткой поворота: декодер обязан вернуть 1×2
Почему шкала обрывается на 95 и на 25
Верхняя граница стоит на 95 не из осторожности: выше этого значения вес растёт быстро, а глаз не выигрывает ничего — кодировщик начинает хранить шум сенсора. Нижняя стоит на 25, потому что ниже фотография перестаёт выглядеть фотографией и превращается в набор квадратов. Всё осмысленное лежит между этими числами, и подбор ведётся только там.
Между 25 и 95 ровно 71 возможное значение, и семи проб бисекции хватает, чтобы прийти к единственному подходящему: каждая проба делит оставшийся отрезок пополам. Больше проб не нужно, а меньше — недостаточно, чтобы шкала сошлась.
Что сохраняет качество лучше настроек
- Не сжимать дважды. Если файл уже укладывается в цель, формат совпадает и уменьшать сторону вы не просили, инструмент возвращает оригинал: повторное кодирование квантует уже квантованное, и картинка мягчает без всякой пользы.
- Сначала обрезать, потом сжимать. Убранные с краёв пиксели не нужно ни хранить, ни кодировать.
- Не увеличивать. Инструмент никогда не растягивает изображение: увеличение выдумывает детали и берёт за них байты.
- Работать от оригинала, а не от присланного мессенджером файла: тот уже пережил одно сжатие, о котором вам не сообщили.
Ориентация: почему снимок не ложится набок
Телефон снимает в собственной ориентации сенсора и приписывает к файлу метку, как повернуть картинку при показе. Браузеры относятся к этой метке по-разному, и проверка «умеет ли браузер её учитывать» ничего не доказывает: один и тот же движок принимал нужный параметр, но не применял его.
Поэтому проверка сделана по эффекту. В код зашит крошечный снимок два на один пиксель с меткой поворота: если декодер вернул его как один на два, метку он действительно применяет, и можно довериться браузеру. Если нет, метка читается из файла вручную, и канвас поворачивается нашим кодом.
Частые вопросы
Бывает ли сжатие фотографии совсем без потерь?
Форматы без потерь существуют, но для снимка они дают файл заметно крупнее исходного JPEG. Практический смысл имеет только сжатие без видимой глазу разницы.
Какое качество ставить, чтобы разницы не было видно?
Начинайте с верхней части шкалы и снижайте, пока не заметите изменений на однотонных участках — небо и кожа портятся первыми, а трава и текстуры прощают многое.
Почему повторное сжатие портит картинку сильнее ожидаемого?
Потому что второй проход квантует уже квантованные данные: ошибки первого кодирования становятся исходником для второго и накапливаются, даже если качество выставлено высокое.
Файл после сжатия стал больше. Как так?
Обычно это значит, что браузер не смог записать запрошенный формат и подставил другой. Инструмент такое отклоняет и сообщает об ошибке вместо выдачи файла крупнее исходного.