При экспорте изображения вы ведь всегда воспринимали этот ползунок качества JPEG как процент? Тянете до 80 и думаете: «сохраняю 80% качества»; ставите 100 и думаете: «теперь точно ничего не потеряно».
Это понимание нужно полностью перевернуть: число на ползунке не имеет никакого отношения к «проценту качества», и качество 100 — тоже не без потерь. Сразу приведу выводы, которые можно применять на практике: если хотите надёжно сохранить фотографию, ставьте 85–92; для веба и соцсетей достаточно 75–82; 100 не стоит ставить по умолчанию — это только удвоит или даже утроит размер файла, а качество ничуть не улучшит. Ниже простыми словами разберу этот ползунок.
Одной фразой: ползунок качества JPEG управляет не тем, «сколько качества сохранить», а тем, насколько велики делители в таблице квантования — чем больше делитель, тем жёстче округление, тем больше потерь. Он не имеет линейной связи ни с качеством, ни с размером: изменение с 100 до 90 не равно изменению с 20 до 10.
Сначала оговорим предпосылку: JPEG — формат с потерями, с момента нажатия кнопки сохранения он уже теряет данные, ползунок определяет лишь «насколько сильно терять», а не «терять или нет». У этого процесса потерь есть фиксированная последовательность, и ползунок — это последний шлюз на этом конвейере.
При сохранении изображение сначала преобразуется из RGB в YCbCr, яркость и цвет разделяются на два канала. Это делается потому, что человеческий глаз гораздо лучше различает яркость, чем цвет; сначала их разделяют, чтобы затем приоритетно сохранять яркость.
Затем всё изображение разбивается на блоки 8×8 пикселей, каждый блок проходит дискретное косинусное преобразование (DCT), преобразующее цвета пикселей в набор частотных значений. Это можно сравнить с разложением аккорда на отдельные ноты: низкие частоты — это основной тон и градиенты изображения, высокие частоты — резкие края и мелкая текстура. Полное описание этого процесса есть в статье о JPEG в Википедии.
Самое разрушительное происходит на последнем шаге: каждое частотное значение делится на число из таблицы квантования (Quantization Table), а затем округляется до целого. Округление — это место, где информация умирает навсегда: дробная часть просто отбрасывается и не возвращается. Ползунок качества управляет именно тем, насколько велики эти делители: чем выше значение ползунка, тем меньше делитель, и округление почти не повреждает данные; чем ниже значение ползунка, тем больше делитель, и округление просто стирает детали. А делители высокочастотных составляющих растут быстрее, поэтому первыми всегда приносятся в жертву края и мелкие текстуры.
Вот почему он не может быть процентом. С 100 до 90 и с 20 до 10 делители меняются совершенно по-разному; а как изменятся качество и размер, зависит от того, в какой точке шкалы вы находитесь: возле 90 при перетаскивании на одно деление вы можете ничего не заметить; возле 20 при перетаскивании на одно деление изображение уже испорчено. Понимать его как процент — самое распространённое и самое дорогое заблуждение относительно этого элемента управления.
Сразу ответ: 100 ещё очень далеко от «без потерь»; есть два серьёзных недостатка: один не зависит от ползунка, а второй не исправить даже ползунком.
Первый — субдискретизация цветности (chroma subsampling). После преобразования RGB в YCbCr, но до начала собственно сжатия, большинство кодеков сначала отбрасывают около 75% цветовых деталей — причина всё та же: человеческий глаз малочувствителен к цвету, и этой потери не заметно. Этот шаг вообще не подчиняется ползунку, он выполняется, даже если вы поставите 100.
Второй — сама математика не безупречна. Даже если делители в таблице квантования выставлены на минимум, при «преобразовании пикселей в частоты и обратно из частот в пиксели» всё равно остаются небольшие ошибки округления. Сохранённый файл при открытии уже не содержит тех самых пикселей, что были при нажатии кнопки сохранения.
Если действительно нужно сохранить всё бит в бит, идите по пути без потерь: PNG, TIFF или WebP в режиме без потерь. Формат с потерями — это дорога в один конец; для JPEG это верно при любом уровне качества, включая тот «идеальный» 100.
Многочисленные практические тесты и попиксельные сравнения в итоге подводят к очень чёткой границе: два диапазона покрывают практически все сценарии.
85–92 — это режим сохранения. Портфолио, снимки для сдачи клиенту, те исходники, которые вам дороги, — ставьте этот диапазон. Файл, сохранённый с качеством 90, составляет примерно 1/8–1/12 от несжатого, а разница не видна невооружённым глазом — нужно увеличить до 400% и всматриваться в определённый участок, чтобы заметить изменения.
75–82 — это веб-режим. Изображения для сайтов, загрузка в соцсети — ставьте этот диапазон. Файл на 40–60% меньше, чем в режиме сохранения, а платите вы лишь лёгкой мягкостью в местах со сложными текстурами, при обычном просмотре почти незаметной.
Если вы читали предыдущую статью «С потерями и без потерь», приведённый там оптимальный диапазон 80–85 не противоречит этим двум диапазонам: около 80 — это как раз веб-режим, 85 — уже входит в режим сохранения; изображения, уже сохранённые с 80–85, не нужно пересжимать.
Если свести три диапазона к одной фразе: то, что нужно сохранить, — 85–92; то, что отправляется наружу, — 75–82; ниже 60 — минное поле, обходите стороной.
По умолчанию выставлять 100 при экспорте — это тревога, а не стратегия. Файл с качеством 85 на 60–75% меньше, чем с качеством 100, но визуально разницы не видно никакой; для веба это просто напрасное растягивание времени загрузки — этот расчёт для сайтов я подробно разбирал в статье об ускорении изображений для веба.
Когда ползунок опускается ниже 60, качество падает не по склону, а с обрыва.
Причина всё та же — округление. При слишком низких значениях делители высокочастотных составляющих становятся абсурдно большими, частотное значение после деления и округления просто обнуляется — этой детали как будто и не было. В результате целые классы визуальной информации исчезают массово: волоски, переплетение тканей, кончики штрихов у букв с засечками — всё это исчезает в первую очередь.
То, что остаётся, — это стандартные артефакты JPEG: блочные пятна 8×8, полосы в градиентах, бахрома и «москитный шум» (mosquito noise) вдоль резких краёв. Крупные формы ещё на месте, но это изображение уже нельзя назвать «картинкой для людей». О том, как возникает каждый вид артефактов, я написал отдельную статью с иллюстрациями.
Поэтому мой вывод: 60 — это практический минимум для обычных изображений. Те несколько КБ, которые вы сэкономите, опустившись ниже, дают результат, который сразу выглядит фальшиво, и это не стоит того.
«Качество 90» — не универсальная валюта. Спецификация JPEG приводит набор рекомендованных таблиц квантования (Annex K), но какую таблицу использует каждая программа и как её масштабирует — каждая решает сама. При одинаковом «высоком качестве» четыре распространённых инструмента дают совершенно разные числа: шкала Photoshop — 0–12, его 10 примерно соответствует 90 в эталонной реализации libjpeg; GIMP и ImageMagick используют шкалу 1–100, GIMP для «высокого качества» берёт 85, ImageMagick — 92; libjpeg как эталонная реализация использует собственное эталонное значение 90.
Если в двух инструментах поставить «качество 85», экспортированные файлы тоже не будут одинаковыми. Поэтому не запоминайте одно число в одной программе и не переносите его в другую. Для сравнения между программами и проектами надёжны только два способа: смотреть фактический размер выходного файла и смотреть фактический результат на изображении.
Ползунок ненадёжен, а глаз зависит от экрана и состояния — можно ли всё-таки количественно оценить «незаметность разницы»? Да, гораздо более надёжный подход — сменить линейку: индекс структурного сходства (SSIM, Structural Similarity Index Measure).
Сравнивает он изображения не попиксельно, а по тому, насколько изменились структура, яркость и контраст — это ближе к тому, как человек оценивает изображение, чем «посчитать, сколько пикселей различаются». Оценка от 0 до 1, где 1 — два изображения полностью идентичны. Формула и история появления подробно описаны в статье о SSIM в Википедии.
Для распространённых уровней качества SSIM примерно таков: файл с качеством 85 обычно получает оценку выше 0,97 — визуально неотличим от оригинала; при падении до 60 оценка оказывается в диапазоне 0,90–0,93 — лёгкая мягкость, заметная при увеличении; при 40 остаётся только 0,82–0,87 — артефакты уже видны невооружённым глазом.
Эти числа гораздо честнее ползунка. Если хотите определить качество без догадок, можно использовать команду compare из ImageMagick (в ImageMagick 7 — magick compare), чтобы напрямую вычислить SSIM двух изображений и найти точку, где размер максимально сокращён, а SSIM ещё не опускается ниже 0,85. Об использовании этой линейки я написал отдельную подробную статью о SSIM.
Маленький инструмент ниже работает целиком в браузере, изображения никуда не отправляются. Выберите изображение (или нажмите «Попробовать образец») и двигайте ползунок, наблюдая размер после сжатия и изменение SSIM. Можно также автоматически найти настройку с наименьшим размером при SSIM ≥ 0,85. Значение SSIM вычисляется в реальном времени для только что сжатого изображения. Это та самая линейка из предыдущего раздела.
Примечание: встроенный в браузер кодировщик JPEG не раскрывает параметры субдискретизации цветности и таблицы квантования. Этот инструмент показывает реальный эффект ползунка и количественно оценивает разницу через SSIM, а не позволяет настраивать внутренности кодировщика. И это прямо подтверждает тезис статьи: качество 100 не без потерь, а одно и то же число в разных программах означает разное.
В большинстве случаев достаточно около 80; 100 не стоит ставить по умолчанию. Файл с качеством 85 на 60–75% меньше, чем с качеством 100, но невооружённым глазом разницы не видно; для фотографий надёжный диапазон — 85–92, для веба и соцсетей достаточно 75–82, ниже 60 появляются заметные артефакты.
Нет. Даже при максимуме 100 JPEG обычно сначала теряет около 75% цветовых деталей при субдискретизации цветности, а затем квантование и округление вызывают необратимые потери. Если нужно без потерь, используйте PNG, TIFF или WebP без потерь.
Шкала качества JPEG в Photoshop — 0–12, а не 1–100; его 10 примерно соответствует 90 в эталонной реализации libjpeg. Разные программы по-разному трактуют одно и то же число; не переносите числа между программами, ориентируйтесь на фактический размер выходного файла и результат на изображении.
Самый прямой способ — увеличить и сравнить с оригиналом; для объективного показателя используйте SSIM. JPEG с качеством 85 обычно имеет SSIM выше 0,97 — визуально неотличим от оригинала; около 40 оценка падает до 0,82–0,87 — артефакты видны невооружённым глазом. Команда compare из ImageMagick (в ImageMagick 7 — magick compare) позволяет вычислить эту оценку напрямую.
Число на ползунке — это параметр деления, а не процент качества; 100 — не без потерь, ниже 60 — обрыв. Если нужна одна формула: фотографии сохраняйте с 85, для веба — с 80, а 100 нигде не нужен — файл удваивается, а качество ничуть не растёт.
Хотите пройти весь путь от выбора формата и изменения размера до настройки качества и ускорения загрузки в вебе — смотрите «Полное руководство по сжатию изображений»: вся цепочка собрана в той статье.