Итак, как это работает?
Чтобы ответить на этот вопрос, можно было бы объяснить очень сложную математику, конечно, больше, чем мы можем затронуть в этой статье, но вам не нужно точно понимать, как это работает математически, чтобы понять основы.
Самые популярные библиотеки для сжатия текста полагаются на два алгоритма сжатия, используя оба одновременно для достижения очень высоких коэффициентов сжатия. Этими двумя алгоритмами являются «LZ77» и «кодирование Хаффмана». Кодирование Хаффмана довольно сложно, и мы не будем подробно разбираться в этом. Прежде всего, он использует некоторую причудливую математику для назначения более короткихдвоичные коды к отдельным письмам, уменьшая размеры файлов в процессе. Если вы хотите узнать больше об этом, ознакомьтесь с этой статьей о том, как работает код, или об этом объясните Computerphile.
LZ77, с другой стороны, относительно прост и о чем мы будем говорить здесь. Он пытается удалить повторяющиеся слова и заменить их на меньший «ключ», который представляет слово.
Возьмите эту короткую часть текста, например:
Мы называем сжатие таким «без потерь» - данные, которые вы вводите, такие же, как и данные, которые вы выходите. Ничего не потеряно.
На самом деле LZ77 не использует список ключей, но вместо этого заменяет второе и третье вхождения ссылкой в памяти:
Если вам интересно более подробное объяснение, это видео из Computerphile очень полезно.
Теперь это идеализированный пример. В действительности, большинство текстов сжимается с помощью клавиш размером всего несколько символов. Например, слово «the» будет сжато, даже если оно появляется в виде слов «там», «их» и «затем». С повторным текстом вы можете получить некоторые сумасшедшие коэффициенты сжатия. Возьмите этот текстовый файл со словом «howtogeek», который повторяется 100 раз. Исходный текстовый файл имеет три килобайта. Однако при сжатии он берет только 158 байтов. Это почти 95% сжатия.
Этот алгоритм LZ77 применяется, кстати, ко всем двоичным данным, а не только к тексту, хотя текст, как правило, легче сжимать из-за того, сколько повторяющихся слов использует большинство языков. Например, язык, подобный китайскому, может быть немного сложнее сжать, чем английский.
Как работает сжатие изображения и видео?
Это то, что приводит к тем ужасающим JPEG-файлам, которые люди загружали, делили и скринировали несколько раз. Каждый раз, когда изображение сжимается, оно теряет некоторые данные.
Вот пример. Это скриншот, который я взял, который не был сжат вообще.
Ну, это всего лишь худший сценарий, каждый раз экспортирующий с 0% качеством JPEG. Для сравнения, вот качественный JPEG на 50%, который почти неотличим от исходного изображения PNG, если вы не взорвете его и не смотрите внимательно.
Итак, как это экономит столько места? Ну, алгоритм JPEG - это подвиг техники. В большинстве изображений хранится список номеров, причем каждое число представляет собой один пиксель.
JPEG ничего не делает. Вместо этого он хранит изображения, используя что-то, называемое дискретным косинусным преобразованием, которое представляет собой совокупность синусоидальных волн, объединенных вместе с различной интенсивностью. Он использует 64 разных уравнения, но большинство из них не используются. Это то, что делает слайдер качества для JPEG в Photoshop и других графических приложениях - выберите, сколько уравнений использовать. Затем приложения используют кодировку Хаффмана, чтобы еще больше уменьшить размер файла.
Это дает JPEG с безумно высоким коэффициентом сжатия, что может уменьшить файл, который будет иметь несколько мегабайт до нескольких килобайт, в зависимости от качества. Конечно, если вы слишком много используете его, вы получите следующее:
Сжатие видео
Мы используем что-то под названием «межкадровое сжатие», которое вычисляет изменения между каждым фреймом и сохраняет их только. Так, например, если у вас относительно неподвижный снимок, который занимает несколько секунд в видео, много места сохраняется, потому что алгоритму сжатия не нужно хранить все вещи в сцене, которые не меняются. Межкадровое сжатие является основной причиной того, что у нас есть цифровое телевидение и веб-видео. Без него видеоролики будут составлять сотни гигабайт, что больше, чем средний размер жесткого диска в 2005 году, когда YouTube запускается.
Кроме того, поскольку межкадровое сжатие лучше всего работает с главным образом стационарным видео, вот почему конфетти разрушает качество видео.
Примечание: GIF этого не делает, поэтому анимированные GIF-файлы часто очень короткие и маленькие, но все же имеют довольно большой размер файла.
Еще одна вещь, о которой нужно помнить о видео, - это его битрейт - количество данных, разрешенных в каждую секунду. Например, если ваш битбит составляет 200 кбит / с, ваше видео будет выглядеть довольно плохо. Качество идет вверх по мере роста битрейта, но после нескольких мегабайт в секунду вы получаете убытки.
Это увеличенный кадр, взятый из видео медузы. Слева - 3 Мбит / с, а справа - 100 Мбит / с.
Эта демонстрация действительно улучшает работу с фактическим видео, поэтому, если вы хотите проверить это самостоятельно, вы можете скачать те же самые тестовые видеоролики, используемые здесь.
Сжатие аудио
MP3 также использует битрейт, начиная с нижнего конца 48 и 96 кбит / с (нижний) до 128 и 240 кбит / с (довольно хорошо) до 320 Кбит / с (высококачественный звук), и вы, скорее всего, услышите разницу только с исключительно хорошими наушниками ( и уши).
Существуют также кодеки сжатия без потерь для аудио, основным из которых является FLAC, который использует кодирование LZ77 для доставки абсолютно без потерь звука. Некоторые люди клянутся отличным качеством звука FLAC, но с преобладанием MP3, кажется, большинство людей либо не могут сказать, либо не возражают против разницы.