🧠 COMPUTER SCIENCE

Как сжимаются фотографии: JPEG простыми словами

Одна фотография с телефона — это миллионы цветных точек, и честно весит она десятки мегабайт. Но в галерее лежит файл в десять раз легче, а глазом разницы не видно. Разбираемся, как JPEG творит эту магию.

Снимаешь кота на телефон — и получаешь файл на пару мегабайт. А ведь "по-честному" этот кадр должен весить раз в десять больше. Куда делись остальные мегабайты и почему ты этого даже не заметил? Вот тут и начинается история JPEG.

Сколько на самом деле весит фотография

Любая цифровая картинка — это сетка из крошечных квадратиков, пикселей. У каждого пикселя есть цвет, и компьютер хранит его тремя числами: сколько в нём красного, зелёного и синего. Каждое число — это байт, то есть значение от 0 до 255.

Посчитаем. Обычное фото с телефона — это, скажем, 4000 на 3000 пикселей. Перемножаем: 12 миллионов пикселей. На каждый нужно 3 байта. Итого около 36 мегабайт — и это всего один кадр! Если бы фотографии хранились так, твоя галерея сожрала бы память за неделю, а отправить снимок в мессенджере было бы пыткой.

Значит, картинку нужно сжать — упаковать так, чтобы она занимала меньше места. И вот тут есть два пути.

Два вида сжатия: без потерь и с потерями

Первый путь — сжатие без потерь. Это когда мы упаковываем данные хитрее, но не теряем ни кусочка. Представь, что в тексте сто раз подряд идёт буква "а". Вместо того чтобы писать сто букв, можно записать коротко: "а ×100". Развернул обратно — и получил ровно то же самое. Так работают ZIP-архивы и формат PNG.

Но с фотографиями такой фокус экономит мало: в реальном снимке соседние пиксели почти никогда не повторяются точь-в-точь. Поэтому JPEG идёт вторым путём — это сжатие с потерями.

Главная идея JPEG: выбросить из картинки те детали, которые твой глаз всё равно не замечает — и сэкономить на них кучу места.

Звучит дерзко: как это "выбросить детали"? Но тут весь смысл в том, что человеческий глаз — прибор хоть и чудесный, но не идеальный. И у него есть слабые места, на которых можно сыграть.

Глаз ленится — и это нам на руку

Первая хитрость связана с тем, что наши глаза по-разному относятся к яркости и к цвету. Яркость — то, насколько светлая или тёмная точка, — мы различаем очень точно. А вот к оттенкам цвета мы куда менее внимательны.

Поэтому JPEG раскладывает картинку на две части: отдельно карту яркости и отдельно карту цвета. И с цветовой картой поступает нагло — огрубляет её, хранит цвет не для каждого пикселя, а сразу для группы соседних. Деталей яркости при этом не трогает. Результат: данных меньше, а на глаз почти то же самое.

Хорошая аналогия — раскраска в детской книжке. Чёткие чёрные контуры (это яркость) должны быть аккуратными, иначе сразу видно. А вот цвет можно заливать слегка небрежно, чуть вылезая за линии, — картинка всё равно читается отлично. JPEG "заливает цвет небрежно" именно потому, что глаз это прощает.

Картинку режут на блоки и раскладывают на волны

Дальше — самое интересное. JPEG разрезает изображение на маленькие квадраты 8 на 8 пикселей и работает с каждым по отдельности. В таком квадратике почти всегда есть крупные плавные переходы (например, небо медленно темнеет) и есть мелкие резкие детали (травинки, шум, текстура).

Специальная математика (она называется дискретным косинусным преобразованием) умеет описать любой такой блок как сумму простых узоров — от очень плавных до очень частых, дробных. Представь звук: гул баса — это плавная, медленная "волна", а тонкий писк — частая, дробная. Любую мелодию можно собрать, смешав волны разных частот. С картинкой то же самое, только волны не звуковые, а зрительные.

А теперь ключевой ход. Глаз плохо замечает самые мелкие, частые детали в блоке. Поэтому JPEG их огрубляет или вовсе обнуляет — и именно на этом шаге происходит главная экономия. Ты сам решаешь, насколько агрессивно: это и есть тот самый ползунок "качество" при сохранении.

  • Качество 90–100 — выбрасываем чуть-чуть, разницы не видно, файл умеренный.
  • Качество 50–70 — золотая середина: файл лёгкий, картинка приятная.
  • Качество 10–20 — выброшено слишком много: вокруг резких границ вылезают квадратные "артефакты".

После этого остаётся куча нулей и повторов — а вот их уже добивает обычное сжатие без потерь, то самое "а ×100".

Когда JPEG — друг, а когда враг

JPEG великолепен для фотографий: там плавные переходы, сложные текстуры, и потерянные мелочи незаметны. Именно поэтому почти все снимки в интернете и в твоём телефоне — это JPEG.

Но у него есть слабость. Там, где в картинке есть резкие чёткие границы — текст, скриншот, логотип, простая геометрия — JPEG начинает мусорить: вокруг букв появляется грязная кайма, цвета "плывут". Для таких случаев лучше PNG, который сжимает без потерь.

И ещё одна важная вещь: JPEG теряет данные каждый раз, когда ты пересохраняешь файл. Открыл, чуть подправил, сохранил — и качество немного просело. Сделай так десять раз подряд — и фотография начнёт разваливаться на квадраты, как испорченный телефон в игре "глухой телефон". Поэтому исходники лучше хранить в форматах без потерь, а в JPEG переводить уже финальную версию.

Вот и весь секрет. JPEG не "уменьшает" картинку волшебством — он умно жертвует тем, чего ты всё равно не увидишь. Маленький файл, почти та же картинка и твой глаз, который радостно не замечает подвоха.

#jpeg#изображения#как это работает#пиксели#сжатие
Понравилась статья?
В Telegram-канале — лучшее из журнала и анонсы новых учебников.