Перейти к содержимому
Приложение C. Сжатие данных: почему файлы можно уменьшить

Сжатие на строке и на картинке

Сожмите строку двумя способами, выбросите из блока 8×8 мелкие волны, как это делает JPEG, и решите, где потери допустимы, а где каждый бит важен.

// избыточность на просвет

Любое сжатие живёт за счёт избыточности: повторов, закономерностей, предсказуемых кусков. Выберите образец и открывайте куски результата по одному. Счёт идёт в символах: слева видно, сколько их было, справа - сколько стало.

Так выглядит строка пикселей одного цвета: скриншот с белым фоном, простая графика, ровная заливка.

Было символов: 30 бббббббббббббббббббббббббббббб

Повторы подряд

Стало символов: 4

Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.

  1. 30xб серия: бббббббббббббббббббббббббббббб

Словарь кусков

Стало символов: 21

Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.

  1. б
  2. б
  3. б
  4. б
  5. [4:4] ссылка: бббб
  6. [8:8] ссылка: бббббббб
  7. [16:14] ссылка: бббббббббббббб

Схлопывание серий сжало 30 символов до 4: вместо тридцати одинаковых записана одна пара «сколько и чего». Словарь тоже справился (21), но пришёл к этому другим путём - через ссылку на уже виденный кусок.

Обычный текст: одинаковых символов подряд почти нет, зато слова повторяются целиком.

Было символов: 33 компьютер и компьютер и компьютер

Повторы подряд

Стало символов: 33

Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.

  1. к
  2. о
  3. м
  4. п
  5. ь
  6. ю
  7. т
  8. е
  9. р
  10. и
  11. к
  12. о
  13. м
  14. п
  15. ь
  16. ю
  17. т
  18. е
  19. р
  20. и
  21. к
  22. о
  23. м
  24. п
  25. ь
  26. ю
  27. т
  28. е
  29. р

Словарь кусков

Стало символов: 25

Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.

  1. к
  2. о
  3. м
  4. п
  5. ь
  6. ю
  7. т
  8. е
  9. р
  10. и
  11. [12:12] ссылка: компьютер и
  12. [24:9] ссылка: компьютер

Серий подряд тут нет, и первый способ ничего не изменил: на входе 33, на выходе 33. Словарь нашёл повторяющиеся куски и сжал до 25: именно так работают ZIP, gzip и PNG.

Ни повторов, ни закономерностей: похоже на уже сжатый файл или на шум.

Было символов: 14 щ7фj2ъ9ы!х3э5ю

Повторы подряд

Стало символов: 14

Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.

  1. щ
  2. 7
  3. ф
  4. j
  5. 2
  6. ъ
  7. 9
  8. ы
  9. !
  10. х
  11. 3
  12. э
  13. 5
  14. ю

Словарь кусков

Стало символов: 14

Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.

  1. щ
  2. 7
  3. ф
  4. j
  5. 2
  6. ъ
  7. 9
  8. ы
  9. !
  10. х
  11. 3
  12. э
  13. 5
  14. ю

Оба способа сдались: на входе 14, на выходе 14 и 14. Сжимать нечего - в строке нет избыточности. Именно поэтому повторное сжатие архива почти ничего не даёт: первое уже убрало всё лишнее.

Счёт в символах условный: настоящие архиваторы считают биты, пишут служебные заголовки и применяют оба приёма сразу, а сверху ещё и коды Хаффмана, где частые символы получают короткую запись, а редкие длинную. Смысл демонстрации в другом: видно, что сжатие ищет избыточность, и если её нет, короче не станет - это и есть предел, который Шеннон назвал энтропией.

// сжатие с потерями

Блок 8×8: что именно выбрасывает JPEG

JPEG режет картинку на блоки восемь на восемь точек и раскладывает каждый блок на волны разных частот: крупные волны - это общая форма, мелкие - тонкие детали и резкие края. Потом мелкие волны выбрасываются, а оставшиеся округляются - тем грубее, чем ниже качество. Возьмите кусок с резкой границей и кусок с плавным переходом и сравните, что делает с ними один и тот же уровень.

Что за кусок картинки
Как было
Какие волны оставили
Что получилось

В карте волн левый верхний угол - крупные волны, правый нижний - мелкие. Синие оставлены, бледные округлились в ноль. Обход зигзагом, как в JPEG.

байт на блок вместо 64
средняя ошибка яркости
худшая точка блока
0 раз пересохранено

Задание: найдите уровень, на котором у буквы появляются отмеченные точки, и проверьте тот же уровень на плавном переходе.

Максимальное

Волн оставлено: 64 из 64, округление до 0,4. Оставлены все 64 волны, округление мелкое - блок собирается почти точно таким, каким был. Файл при этом почти не уменьшился: платить за точность приходится размером.

Хорошее

Волн оставлено: 40 из 64, округление до 0,8. Выброшена мелкая треть волн. На плавном переходе ошибка почти не выросла - глазом такое не поймать. На букве уже появились отмеченные точки: у резких краёв запаса нет.

Среднее

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

Низкое

Волн оставлено: 8 из 64, округление до 5. Осталась общая яркость и несколько крупных волн. Отмеченные точки уехали от исходных больше чем на единицу яркости - это и есть те самые артефакты вокруг букв. Плавный переход всё ещё держится.

Как в мессенджере

Волн оставлено: 3 из 64, округление до 8. Блок превратился в пятно средней яркости с намёком на форму. Зато вместо 64 байт он занимает считанные единицы - ровно этим и берут десятикратное сжатие фотографий.

Буква на скриншоте

Яркость точек по строкам: 9 9 1 1 1 9 9 9 / 9 9 1 1 1 9 9 9 / 9 1 1 9 9 1 9 9 / 9 1 1 9 9 1 1 9 / 9 1 1 1 1 1 1 9 / 9 1 1 9 9 9 1 1 / 9 1 1 9 9 9 1 1 / 9 9 9 9 9 9 9 9. Резкая граница между тёмным и светлым живёт как раз в мелких волнах: выбросить их - значит размазать края. Поэтому текст и графику сохраняют без потерь, в PNG.

Плавный переход, как на фотографии

Яркость точек по строкам: 9 9 8 8 7 7 6 6 / 9 8 8 7 7 6 6 5 / 8 8 7 7 6 6 5 5 / 8 7 7 6 6 5 5 4 / 7 7 6 6 5 5 4 4 / 7 6 6 5 5 4 4 3 / 6 6 5 5 4 4 3 3 / 6 5 5 4 4 3 3 2. Здесь всё держится на нескольких крупных волнах, а мелких почти нет. Тот же уровень качества даёт ошибку в разы меньше - на фотографии её просто нечем заметить. Отсюда и десятикратное сжатие снимков.

Настоящий JPEG держит свой шаг округления для каждой волны и дожимает результат кодами Хаффмана. Здесь оставлено главное: что выброшено и что от этого стало с картинкой.

// что выбрать под задачу

Без потерь или с потерями: решает не формат, а задача

Оба способа не лучше и не хуже друг друга - они про разное. Сначала решите сами, что подходит под задачу, потом смотрите разбор.

Без потерь ZIP, PNG, FLAC
С потерями JPEG, MP3, H.264
Задача Скриншот с текстом
Что здесь подходит?
Без потерь Края букв остаются чёткими: ни один пиксель не изменился.
С потерями Вокруг букв появляется грязь - те самые артефакты из блока выше.

Семь задач, и по каждой сначала выбор, потом разбор. Подсказка: смотрите не на формат, а на то, что случится, если часть данных пропадёт.

0 / 7 угадано
Скриншот с текстом

Без потерь: Края букв остаются чёткими: ни один пиксель не изменился.

С потерями: Вокруг букв появляется грязь - те самые артефакты из блока выше.

Резкая граница живёт в мелких волнах, а сжатие с потерями выбрасывает именно их. Поэтому скриншоты - в PNG, и только в PNG.

Фотография заката для сайта

Без потерь: Файл в несколько мегабайт: страница будет грузиться заметно дольше.

С потерями: В десять-двадцать раз меньше при разнице, которую на экране не найти.

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

Исходный код и таблицы

Без потерь: Текст сжимается в несколько раз и распаковывается побайтово точно.

С потерями: Потерять любой символ значит потерять смысл: так не делают вовсе.

В текстах много повторов - ключевые слова, отступы, имена, - поэтому словарь и коды Хаффмана работают отлично. А выбрасывать здесь нечего: каждый байт значим.

Полуторачасовой фильм

Без потерь: Терабайты: столько не отдать по сети и не положить на диск.

С потерями: Пара гигабайт - в сотни раз меньше несжатого потока.

Между соседними кадрами разница обычно крошечная, и кодек хранит только её, а полный кадр - раз в несколько секунд. Отсюда и сотни раз, и «рассыпание» картинки на резких склейках, где разница велика.

Запись, которую будут монтировать

Без потерь: Каждое сохранение оставляет запись такой же: монтировать можно сколько угодно раз.

С потерями: Каждый проход выбрасывает новую порцию - через три пересохранения слышно.

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

Голос в звонке на слабой сети

Без потерь: Канал не выдержит: звук начнёт заикаться и отставать.

С потерями: Речь остаётся разборчивой на считанных килобитах в секунду.

Для речи важна разборчивость, а не точность записи. Кодек выбрасывает всё, что ухо не различает на этом уровне громкости, - и остаётся в полосе, которая есть.

Уже сжатый архив или ролик

Без потерь: Повторов не находится: размер меняется на проценты, иногда в плюс.

С потерями: Выбрасывать нечего: избыточность убрало первое сжатие.

Первое сжатие уже добралось до предела энтропии - количества настоящей информации в файле. Дальше не помогает ни один способ: сжимать нечего.

Числа сжатия из главы: текст в ZIP - в два-десять раз, фотография в JPEG - в десять-двадцать, музыка в MP3 - примерно в десять, видео в H.265 - в сотни раз по сравнению с несжатым потоком.

Интерактив разработан - ремонт компьютеров и ноутбуков в Барановичах. © 2008-2026. Источник: any.by/demo/szhatie-na-stroke