Как уменьшить размер фото: разрешение, качество, субдискретизация и метаданные
Пять факторов веса фото — разрешение, качество, цветовая субдискретизация, метаданные, формат — и как уменьшить фото, например, до 200 КБ почти без потери качества.
Размер файла фотографии определяется тем, «сколько пикселей, по сколько бит на пиксель и с какой дополнительной информацией» в нём сохранено. Снимок со смартфона обычно весит 3–5 МБ, а форма загрузки для анкеты часто требует 100–500 КБ. Сократить этот разрыв можно пятью основными способами. В статье разберём, как каждый из них влияет на размер и качество и в каком порядке их применять, чтобы уложиться в целевой размер.
1. Разрешение — самый надёжный способ уменьшить файл
Размер несжатых данных равен ширина в пикселях × высота в пикселях × 3 байта (RGB). Фото 4032×3024 пикселя — это около 12,19 млн пикселей, или примерно 36 МБ несжатых данных. Если уменьшить ширину и высоту вдвое, число пикселей сократится в 4 раза, и размер после сжатия уменьшится примерно в той же пропорции.
| Ширина×высота (px) | Число пикселей | Несжатые данные (RGB) | Пример использования |
|---|---|---|---|
| 4032×3024 | около 12,19 млн | около 36,6 МБ | Оригинал со смартфона |
| 2016×1512 | около 3,05 млн | около 9,1 МБ | Фото высокого качества в статье блога |
| 1080×1350 | около 1,46 млн | около 4,4 МБ | Вертикальный пост в Instagram |
| 413×531 | около 0,22 млн | около 0,66 МБ | Фото на паспорт (рекомендуемый размер для онлайн-заявки в Корее) |
Если нужный размер в пикселях известен заранее, как у фото для анкеты, сначала уменьшите изображение до него. Часто одного этого хватает, чтобы уложиться в лимит. Для онлайн-заявки на корейский паспорт МИД Республики Корея рекомендует 413×531 пикселей и не более 500 КБ — JPG такого размера обычно с запасом проходит лимит даже при высоком качестве.
2. Качество и квантование — что делает ползунок «качество» в JPG и WebP
JPG делит изображение на блоки 8×8, переводит их в частотные составляющие, затем делит каждую составляющую на значение из таблицы квантования и округляет. При снижении качества делители растут, и больше высокочастотных компонентов после округления становятся нулями. Длинные серии нулей очень компактно записываются последующим энтропийным кодированием (кодом Хаффмана), поэтому файл уменьшается.
- Качество 90 и выше: на глаз почти не отличить от оригинала, но размер резко растёт.
- Качество 70–85: самый эффективный диапазон для фотографий. В нём находится большинство фото в интернете.
- Качество 50 и ниже: появляются ступенчатые переходы на небе и коже, ореолы вокруг краёв (звон) и границы блоков 8×8.
Зависимость размера от качества не линейна. При снижении с 95 до 85 размер падает сильно, а с 60 до 50 — ненамного, зато ухудшение качества заметнее. Поэтому если приходится опускать качество ниже 60, лучше уменьшить разрешение — результат будет лучше.
3. Цветовая субдискретизация — храним меньше информации о цвете
Глаз чувствителен к изменениям яркости, но менее чувствителен к изменениям цвета. Поэтому JPG и WebP с потерями обычно переводят RGB в яркость (Y) и цветоразностные компоненты (Cb, Cr) и хранят цветоразностные с половинным разрешением по ширине и высоте (4:2:0). Уже это сокращает цветовую информацию в 4 раза, а общий объём несжатых данных — вдвое.
На фотографиях разница почти не видна, но на изображениях с красным текстом или тонкими цветными линиями края букв могут расплываться. WebP с потерями по спецификации всегда использует 4:2:0 (MDN), поэтому для графики, где важен цветной текст, лучше подходят PNG или WebP без потерь.
4. Метаданные — десятки КБ, спрятанные внутри фото
В снимках со смартфона вместе с изображением хранятся данные EXIF (модель устройства, время, GPS-координаты), маленькая миниатюра для предпросмотра и цветовой профиль (ICC). Обычно это от нескольких до нескольких десятков КБ — немного на фоне всего файла, но при жёстком лимите, например до 100 КБ, этим нельзя пренебречь. А главное — в файле остаётся информация о местоположении. При повторном кодировании через Canvas в браузере большая часть этих данных удаляется. Подробнее — в статье метаданные EXIF и приватность.
5. Выбор формата — то же качество меньшим числом байтов
При одинаковом качестве новые кодеки дают меньший размер. По данным Google, WebP с потерями при том же качестве SSIM на 25–34% меньше JPG, а AVIF обычно ещё меньше. Но если получатель принимает только JPG, формат не поменять, поэтому этот способ применяют в основном для публикации в интернете. Различия форматов описаны в статье JPG vs PNG vs WebP vs AVIF.
Значения качества несовместимы между форматами и программами
«Качество 80» — это не единица, закреплённая стандартом. Каждый кодировщик по-своему переводит значение качества в силу квантования, поэтому одно и то же 80 даёт разное качество и размер у JPG, WebP и AVIF, и даже для JPG результат немного отличается от программы к программе. Поэтому точнее не опираться на абсолютное правило «сохранять с таким-то значением», а выбирать, сравнивая результат с оригиналом в увеличении. Если нужно обработать много файлов с одинаковыми настройками, сначала проверьте на одном, а потом примените к остальным.
Прогрессивный JPG
Помимо базового (baseline) режима, при котором изображение прорисовывается сверху вниз за один проход, стандарт JPG (T.81) определяет прогрессивный (progressive) режим: сначала показывается размытая картинка целиком, которая постепенно становится чётче. На медленном соединении большие фото при этом ощущаются быстрее. Разница в размере зависит от снимка, а некоторые старые устройства и программы не читают прогрессивный JPG, поэтому для отправки документов надёжнее базовый режим.
Пример подбора параметров
Допустим, фото со смартфона 4032×3024 (около 3–4 МБ) нужно загрузить с условием «ширина не более 1000 пикселей, размер не более 200 КБ».
- Сначала уменьшите ширину до 1000 пикселей. Высота с сохранением пропорций станет 750 пикселей, а число пикселей сократится примерно до 6% от исходного. Уже после этого шага файл обычно весит несколько сотен КБ или меньше.
- Сохраните с качеством 85 и проверьте, не превышает ли файл 200 КБ. Если превышает, снижайте качество до 80, 75 и т. д. или ищите значение двоичным поиском.
- Если снимок шумный, как ночное фото, и качество приходится опускать ниже 60, аккуратнее будет немного уменьшить ширину — до 900 пикселей.
Порядок подгонки под целевой размер (КБ)
Чтобы выполнить условие вроде «загрузите файл не больше 200 КБ» с минимальной потерей качества, действуйте так.
- Сначала уменьшите до нужного размера в пикселях. Если требования заданы — до них, если нет — до размера показа на экране (например, 1200–2000 px по ширине).
- Найдите качество двоичным поиском. Сохраните со средним значением между 50 и 95; если файл больше цели, делите пополам нижнюю половину диапазона, если меньше — верхнюю. За 7–8 шагов находится максимальное качество, укладывающееся в лимит.
- Если качество становится слишком низким, ещё немного уменьшите разрешение. Уменьшение ширины и высоты на 10% сокращает число пикселей примерно на 19%. Затем повторите шаг 2.
- Уточните, как считаются КБ. Где-то 1 КБ — это 1000 байт, а где-то 1024 байта. Если неизвестно, считайте 1 КБ = 1000 байт и делайте файл меньше — так он пройдёт по обоим вариантам.
- Различайте «менее» и «не более». При условии «менее 100 КБ» файл ровно 100 КБ не пройдёт.
Инструмент уменьшение размера фото выполняет этот процесс автоматически. Введите целевой размер в КБ — он подберёт качество двоичным поиском, а достигнув нижней границы качества, начнёт уменьшать разрешение и выберет самый чёткий результат в пределах лимита.
Частые ошибки
- Пересохранять уменьшенный файл с большим качеством: если JPG уже сохранён с качеством 60, пересохранение с качеством 95 лишь увеличит размер — качество не вернётся.
- Многократно пережимать: при каждом сохранении потери накапливаются. Всегда получайте нужный результат из оригинала за один раз.
- Сжимать скриншоты в JPG: текст расплывается, а файл иногда получается даже больше PNG. Скриншоты оставляйте в PNG или уменьшайте разрешение.
Частые вопросы
Если сохранить с качеством 100, файл будет идентичен оригиналу?
Даже при качестве 100 JPG теряет часть информации при преобразовании цвета и округлении, поэтому это не полноценное сжатие без потерь. К тому же при качестве выше 90 видимой разницы почти нет, а размер файла часто сильно растёт.
Разве уменьшение разрешения не ухудшает изображение?
Разрешение больше, чем размер показа на экране, всё равно уменьшается при отображении, поэтому после уменьшения разница почти не ощущается. Но если уменьшить картинку сильнее, чем нужно, а потом снова увеличить, она станет размытой — поэтому сначала уточните размер в пикселях для конечного назначения.
Почему при одинаковых настройках разные фото весят по-разному?
Эффективность сжатия сильно зависит от содержимого. Простые кадры, например голубое небо, получаются маленькими, а детализированные — листва, песок, ночные снимки с шумом — большими.
Попробовать сейчас