Як працює стиснення файлів?


19

Отже, сьогодні я зрозумів, що стискаю файли як належне. Можливість поєднання декількох файлів разом в один і виходить менше, ніж будь-який з них, я просто сприймаю як факт, але як це насправді працює?

У мене є обмежені знання про це, що включає щось, що стосується заміни всіх дублікатів записів покажчиками, щоб зменшити цей спосіб, але поза цим я досить незрозумілий!

Оскільки я завжди відкритий до нових знань, так як я думаю, що більшість із нас тут є, я думав, що запитаю. Отже, SuperUser, як насправді працює компресія ?


1
Стаття у Вікіпедії - це гарний початок, але було б непогано мати більш конкретні пояснення. Хороше запитання (хоча я був впевнений, що у нас вже було таке питання, але здається, що ні).
Gnoupi

2
@Gnoupi: Дійсно, перше, що я зробив - це пошук, оскільки я був впевнений, що тут є такий. Мабуть, ні, тому я спробував виправити це: P
Phoshi

2
у нас є тег "що-що", коли ви публікуєте фотографії та переходите "wot izzit ??"; Я помічав необхідність тегу "як-як-це-працює", але це занадто довго, і "робота" звучить німо. "пояснити", могло б це зробити.
шарлатаний кіхот

@quack Кіхот: А, дякую. Я шукав у автозаповнення тег типу "plz-send-the-обяснення", але не зміг його знайти.
Phoshi

2
я наблизився до того, щоб просто кілька разів створити тег "як" ... але "пояснити", мабуть, краще. "підручник" і "як" і "для початківців" - все напівпридатне, але не зовсім підходить.
квахтіт-кіхот

Відповіді:


18

Стиснення без втрат

Стиснення без втрат - це не втрачаються дані. Все, що вводиться, можна отримати ідеально. Це добре працює для текстових чи двійкових файлів, де буде помічена найменша помилка.

Стиснення файлів працює, беручи файл і скануючи шаблони, і переводячи ці шаблони в щось інше, що займає менше місця.

Наприклад, "AAAAAAAA" можна перетворити на "8A".

Зрозуміло, що це не так, як це працює саме тому, що тоді у вас виникає проблема, що якби "8A" був у відкритому тексті. Ви віджали файл, і це було б неправильно. Хорошим місцем для початку є або Вікіпедія, або Алгоритм стиснення даних LZW .

Для цього скопійованого нижче є декілька просто psuedo-кодів:

STRING = get input character
WHILE there are still input characters DO
    CHARACTER = get input character
    IF STRING+CHARACTER is in the string table then
        STRING = STRING+character
    ELSE
        output the code for STRING
        add STRING+CHARACTER to the string table
        STRING = CHARACTER
    END of IF
END of WHILE
output the code for STRING

Для всього стиснення використовується словник пошуку, який використовується для стиснення та розпакування файлу. Чим більший словник, тим більше ви можете його стиснути, хоча ви все-таки стикаєтесь із Законом зменшення повернення .

Також варто зазначити, що стискання не завжди дає менший файл. Бувають ситуації (з невеликими файлами або при стисненні випадкових даних ), що ви не отримаєте менший файл після стиснення. Були деякі цікаві проблеми, пов'язані зі здатністю стискати випадкові дані.

«Стислий» стиснення

Зазначене в основному стосується стиснення без втрат . Інші типи стиснення, що використовуються у відео / аудіо програмах, таких як MP3, JPG та h.264, є прикладами стиснення втрат .

Стиснення втрат працює за рахунок викидання даних, які найменш вірогідні. В аудіо це звуки близько 30 000 Грц і нижче 100 Гц, а також інші речі. У малюнку (статичному) він видаляє різні речі та об'єднує пікселі разом із викиданням даних.

Стиснення втрат - це форма кодування перетворення . Він усереднює дані, щоб зменшити загальний розмір. Наприклад, блок з 10 пікселів на зображенні, всі трохи різні кольори можуть бути об'єднані разом в один колір і таким чином стиснуті.

При стисненні відео часто вказівки розміщуватимуться лише для перемальовування пікселів, які змінилися з останнього кадру, або ключових кадрів .


Зауважте, що це пояснення лише для стиснення без втрат, виду для якого ви можете відновити точні вихідні дані (скоріш за все, використовуються програмами архівування). Є й інші види стиснення, при яких ви втрачаєте якість для менших розмірів, наприклад, у форматі JPG, MP3 тощо.
Gnoupi

Перший приклад Джоша - це форма реального методу стиснення, який називається Run-Length Encoding, і "8A" буде стиснутий до "181A". Очевидно, його останній абзац стосується тут; RLE найкраще працює з даними з багатьма дублікатами.
Dour High Arch

3
Я додав назви без втрат / втрати і округлив її трохи більше. Добре зазначити, що найкращий спосіб для подальшого розуміння цього - просто прочитати статтю у Вікіпедії.
Джош К

5

Стиснення працює, знаходячи шаблони в даних, а потім замінюючи ці шаблони спеціальними меншими шаблонами. Декомпресія - зворотна: знайдіть спеціальні візерунки та замініть їх на більші візерунки, які вони представляють. Знати, які шаблони є ймовірними, важливо; наприклад, візерунки, знайдені в тексті, можуть бути зовсім іншими, ніж ті, що зустрічаються на зображеннях. Деякі методи стиснення є втратними; вони не гарантують, що розширення точно відновить вхід. Зазвичай це нормально для аналогових даних, таких як музика та зображення, якщо втрата досить мала. Але такі дані, як текст, повинні стискатися методами без втрат.

Важливо усвідомити, що неможливо стиснути без втрат випадкові дані навіть одним бітом. Розглянемо файл з N бітами двійкових даних. Є 2 ^ N можливих файлів. Якщо стиснути будь-який з цих файлів одним бітом, тож стислий файл має розмір N-1, є лише 2 ^ (N-1) можливих стислих зображень. Іншими словами, кожен можливий стислий файл повинен представляти більше одного можливого нестисненого файлу. Без унікального стисненого подання алгоритм декомпресії не може гарантувати декомпресію без втрат.


3
файл може бути нестисненим (прикметник), але не може бути нестисненим (дієслово). замість цього вона декомпресується .
шарлатаний кіхот
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.