Глубокие погружения

HEIC против JPG: теряются ли детали при конвертации? (С примерами)

koboshiCo-founder
·4 мин чтения
Кратко

Конвертация HEIC в JPG действительно теряет данные, потому что JPG не вмещает всё, что умеет HEIC. Вот что сохраняется при качественной конвертации, что проявляется первым при падении качества и как конвертировать без видимой потери.

Сделайте одно фото и сохраните его двумя способами. В HEIC оно весит около 1,8 МБ. В JPG при качестве 90 — около 3,4 МБ. Посмотрите на них рядом в обычном масштабе, и вы их не отличите. При зуме до 400% JPG выглядит чуть мягче в волосах, в траве и на тёмной стене за объектом.

Это смягчение и есть честный ответ на вопрос из заголовка: да, конвертация теряет данные на уровне пикселей, и нет, обычно она не теряет то, что видят ваши глаза. Полезный вопрос в том, когда это «да» становится заметным. Эта статья показывает это на реальных цифрах и рассказывает, как конвертировать, не переходя эту границу.

Что на самом деле происходит при конвертации

HEIC хранит изображение с помощью HEVC (H.265), кодека, созданного для видео. JPG хранит его через блочное DCT-преобразование с субдискретизацией цветности. Когда вы конвертируете HEIC в JPG, изображение декодируется и перекодируется в другой схеме, и это перекодирование происходит с потерями. Часть информации не переживает такой цикл.

Меняются две вещи. Во-первых, метод сжатия даёт другие артефакты. HEVC скрывает свои потери лучше, чем JPG при том же битрейте, и именно поэтому файл HEIC меньше. Во-вторых, падает глубина цвета. HEIC поддерживает каналы в 10 или 16 бит, а JPG жёстко ограничен 8 битами. Если ваше фото хранит по 10 бит на канал, конвертация в JPG навсегда выбрасывает лишние тона.

За байтовой картиной того, как устроен HEIC, обращайтесь к техническому разбору HEIC: там разобраны боксы контейнера и сигнатура файла.

Почему детали прячутся именно в битовой глубине

Канал с глубиной 8 бит хранит по 256 уровней красного, зелёного и синего. Канал с глубиной 10 бит — 1024, то есть в 16 раз больше точности на каждый цвет. На большинстве фотографий с телефона вы эту разницу не увидите, потому что фото редко заполняет весь диапазон плавными градиентами. Разница проявляется там, где её и ждёшь: в закатном небе, которое должно перетекать из тёмно-оранжевого в бледно-жёлтый, в портрете, снятом против света из окна. Именно на таких плавных переходах 8-битный файл начинает показывать полосы: отдельные ступеньки вместо непрерывного перетекания.

Итак, потеря реальна, но она не случайна. Она попадает в градиенты и шум в тёмных участках раньше, чем в лицо или чёткий край здания. Если конвертировать на высоком качестве, остальные потери (блочность, звон, смягчение) остаются настолько малыми, что вы их не заметите без увеличения.

HEIC против JPG при трёх настройках качества

Одно и то же фото на 12 МП, сохранённое четырьмя способами, с HEIC в качестве ориентира:

ФайлРазмерЧто меняется относительно HEIC
HEIC (исходник)1,8 МБточка отсчёта
JPG качество 954,1 МБничего не видно при обычном зуме
JPG качество 903,4 МБлёгкое смягчение мелкой текстуры при 400%
JPG качество 752,1 МБполосы в небе, ореолы вокруг текста

Цифры типичные, а не точные: ваше фото и камера их меняют. Закономерность не меняется. Можно конвертировать с размером, близким к исходному HEIC, и сохранить видимые детали. Расплачиваться начинаешь только тогда, когда ползунок качества опускается достаточно низко и кодировщик начинает экономить.

Где потеря проявляется первой

Если хотите знать, чем обходится плохая конвертация, проверяйте эти места по порядку:

  • Бандинг. Плавные градиенты распадаются на ступеньки. Это потеря битовой глубины, и появляется он первым.
  • Звон. Тонкие ореолы вокруг контрастных краёв, заметнее всего на тексте и оконных рамах.
  • Блочность. Видимые блоки сетки 8 × 8 на однородных участках, обычно исчезает при качестве выше 80.

Одна конвертация высокого качества на большинстве фото не вызывает ничего из этого. Усугубляет их перекодирование: каждый проход добавляет немного шума квантования, и шум накапливается. Это и есть эффект потери поколения, подробно описанный в статье сжатие с потерями и без потерь.

Как конвертировать без видимой потери деталей

Правило короткое: конвертируйте один раз, из исходного HEIC, на высоком качестве. Не конвертируйте из JPG, который уже прошёл через кодировщик, и не прогоняйте результат через ещё одну конвертацию позже.

Наш конвертер HEIC в JPG выполняет конвертацию в вашем браузере с настройкой качества, которую вы контролируете, и читает напрямую из исходного файла. Перетащите HEIC, выберите качество 90 или выше, и получите максимум того, что может нести JPG.

Если нужен результат без потерь или прозрачность, JPG не подходит независимо от качества, это работа для PNG. В статье HEIC против PNG рассказано, когда такой переход оправдан, а руководство по HEIC в WebP — о формате для тех, кто отдаёт изображения в веб.

Краткая версия

Конвертация HEIC в JPG действительно теряет данные, потому что JPG не может вместить всё, что умеет HEIC. При качестве 90 и выше потеря остаётся ниже порога зрения при обычном размере просмотра почти на любом фото. Если кто-то говорит, что конвертация всегда портит качество изображения, он описывает конвертацию на низком качестве, а не саму конвертацию.

Ещё посты в блоге