Сжатие на строке и на картинке
Сожмите строку двумя способами, выбросите из блока 8×8 мелкие волны, как это делает JPEG, и решите, где потери допустимы, а где каждый бит важен.
// избыточность на просвет
Любое сжатие живёт за счёт избыточности: повторов, закономерностей, предсказуемых кусков. Выберите образец и открывайте куски результата по одному. Счёт идёт в символах: слева видно, сколько их было, справа - сколько стало.
Так выглядит строка пикселей одного цвета: скриншот с белым фоном, простая графика, ровная заливка.
Повторы подряд
Стало символов: 4Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.
- 30xб серия: бббббббббббббббббббббббббббббб
Словарь кусков
Стало символов: 21Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.
- б
- б
- б
- б
- [4:4] ссылка: бббб
- [8:8] ссылка: бббббббб
- [16:14] ссылка: бббббббббббббб
Схлопывание серий сжало 30 символов до 4: вместо тридцати одинаковых записана одна пара «сколько и чего». Словарь тоже справился (21), но пришёл к этому другим путём - через ссылку на уже виденный кусок.
Обычный текст: одинаковых символов подряд почти нет, зато слова повторяются целиком.
Повторы подряд
Стало символов: 33Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.
- к
- о
- м
- п
- ь
- ю
- т
- е
- р
- и
- к
- о
- м
- п
- ь
- ю
- т
- е
- р
- и
- к
- о
- м
- п
- ь
- ю
- т
- е
- р
Словарь кусков
Стало символов: 25Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.
- к
- о
- м
- п
- ь
- ю
- т
- е
- р
- и
- [12:12] ссылка: компьютер и
- [24:9] ссылка: компьютер
Серий подряд тут нет, и первый способ ничего не изменил: на входе 33, на выходе 33. Словарь нашёл повторяющиеся куски и сжал до 25: именно так работают ZIP, gzip и PNG.
Ни повторов, ни закономерностей: похоже на уже сжатый файл или на шум.
Повторы подряд
Стало символов: 14Вместо цепочки одинаковых символов записывается пара «сколько и чего»: шесть белых пикселей превращаются в «6 белых». Так устроен RLE - он хорош для больших однотонных областей и бесполезен для фотографий, где одинаковых соседей почти нет.
- щ
- 7
- ф
- j
- 2
- ъ
- 9
- ы
- !
- х
- 3
- э
- 5
- ю
Словарь кусков
Стало символов: 14Уже встреченные куски запоминаются, а их повторы заменяются короткой ссылкой «отступи назад столько-то и возьми столько-то». Это семейство алгоритмов Лемпела и Зива 1977 года, на нём построены ZIP, gzip и PNG.
- щ
- 7
- ф
- j
- 2
- ъ
- 9
- ы
- !
- х
- 3
- э
- 5
- ю
Оба способа сдались: на входе 14, на выходе 14 и 14. Сжимать нечего - в строке нет избыточности. Именно поэтому повторное сжатие архива почти ничего не даёт: первое уже убрало всё лишнее.
Счёт в символах условный: настоящие архиваторы считают биты, пишут служебные заголовки и применяют оба приёма сразу, а сверху ещё и коды Хаффмана, где частые символы получают короткую запись, а редкие длинную. Смысл демонстрации в другом: видно, что сжатие ищет избыточность, и если её нет, короче не станет - это и есть предел, который Шеннон назвал энтропией.
Блок 8×8: что именно выбрасывает JPEG
JPEG режет картинку на блоки восемь на восемь точек и раскладывает каждый блок на волны разных частот: крупные волны - это общая форма, мелкие - тонкие детали и резкие края. Потом мелкие волны выбрасываются, а оставшиеся округляются - тем грубее, чем ниже качество. Возьмите кусок с резкой границей и кусок с плавным переходом и сравните, что делает с ними один и тот же уровень.
В карте волн левый верхний угол - крупные волны, правый нижний - мелкие. Синие оставлены, бледные округлились в ноль. Обход зигзагом, как в JPEG.
Пересохранение работает не с оригиналом, а с уже испорченным блоком: ошибка подросла и сама обратно не вернётся. Настоящую фотографию при каждой пересылке режут на блоки заново, со сдвигом, и она портится снова.
Задание: найдите уровень, на котором у буквы появляются отмеченные точки, и проверьте тот же уровень на плавном переходе.
Волн оставлено: 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 держит свой шаг округления для каждой волны и дожимает результат кодами Хаффмана. Здесь оставлено главное: что выброшено и что от этого стало с картинкой.
Без потерь или с потерями: решает не формат, а задача
Оба способа не лучше и не хуже друг друга - они про разное. Сначала решите сами, что подходит под задачу, потом смотрите разбор.
Семь задач, и по каждой сначала выбор, потом разбор. Подсказка: смотрите не на формат, а на то, что случится, если часть данных пропадёт.
Правило простое: без потерь - там, где важен каждый бит и где файл ещё будут править. С потерями - там, где данные идут прямо к человеку и лишнюю точность всё равно никто не заметит. А на уже сжатом файле не выигрывает никто: предел один для всех способов - энтропия.
Без потерь: Края букв остаются чёткими: ни один пиксель не изменился.
С потерями: Вокруг букв появляется грязь - те самые артефакты из блока выше.
Резкая граница живёт в мелких волнах, а сжатие с потерями выбрасывает именно их. Поэтому скриншоты - в PNG, и только в PNG.
Без потерь: Файл в несколько мегабайт: страница будет грузиться заметно дольше.
С потерями: В десять-двадцать раз меньше при разнице, которую на экране не найти.
На фотографии почти нет одинаковых соседних точек, поэтому сжатие без потерь почти ничего не даёт. Плавные переходы, наоборот, прекрасно ложатся на крупные волны.
Без потерь: Текст сжимается в несколько раз и распаковывается побайтово точно.
С потерями: Потерять любой символ значит потерять смысл: так не делают вовсе.
В текстах много повторов - ключевые слова, отступы, имена, - поэтому словарь и коды Хаффмана работают отлично. А выбрасывать здесь нечего: каждый байт значим.
Без потерь: Терабайты: столько не отдать по сети и не положить на диск.
С потерями: Пара гигабайт - в сотни раз меньше несжатого потока.
Между соседними кадрами разница обычно крошечная, и кодек хранит только её, а полный кадр - раз в несколько секунд. Отсюда и сотни раз, и «рассыпание» картинки на резких склейках, где разница велика.
Без потерь: Каждое сохранение оставляет запись такой же: монтировать можно сколько угодно раз.
С потерями: Каждый проход выбрасывает новую порцию - через три пересохранения слышно.
Пока файл в работе, потери накапливаются: это ровно то, что показывает счётчик пересохранений в блоке выше. С потерями сжимают в самом конце, один раз - когда результат уже готов.
Без потерь: Канал не выдержит: звук начнёт заикаться и отставать.
С потерями: Речь остаётся разборчивой на считанных килобитах в секунду.
Для речи важна разборчивость, а не точность записи. Кодек выбрасывает всё, что ухо не различает на этом уровне громкости, - и остаётся в полосе, которая есть.
Без потерь: Повторов не находится: размер меняется на проценты, иногда в плюс.
С потерями: Выбрасывать нечего: избыточность убрало первое сжатие.
Первое сжатие уже добралось до предела энтропии - количества настоящей информации в файле. Дальше не помогает ни один способ: сжимать нечего.
Числа сжатия из главы: текст в ZIP - в два-десять раз, фотография в JPEG - в десять-двадцать, музыка в MP3 - примерно в десять, видео в H.265 - в сотни раз по сравнению с несжатым потоком.
Интерактив разработан ANY.BY - ремонт компьютеров и ноутбуков в Барановичах. © 2008-2026. Источник: any.by/demo/szhatie-na-stroke