KomPRESja danych

Jak zmieścić więcej w mniejszym pliku? Zobacz, jak działają ZIP, PNG, JPG i MP3: jedne metody niczego nie gubią, a inne celowo wyrzucają to, czego i tak nie zauważysz.

1. Powtórki: RLE

bezstratna

Zamiast pisać „biały, biały, biały, biały, biały”, piszemy „5 × biały”. Tak działa RLE (ang. run-length encoding, kodowanie długości serii). Narysuj coś i zobacz, kiedy to się opłaca, a kiedy wręcz szkodzi.

Zapis RLE, wiersz po wierszu

Bez kompresji: 1 bajt na piksel, czyli 256 bajtów. W RLE każda seria to 2 bajty: ile razy i jaki kolor.

RLE w tekście · wpisz coś

2. Krótkie kody dla częstych liter: Huffman

bezstratna

Normalnie każda litera zajmuje 8 bitów. Ale „A” występuje dużo częściej niż „Ż”, więc czemu nie dać jej krótszego kodu? To ten sam pomysł co w alfabecie Morse'a. David Huffman w 1952 roku wymyślił, jak zbudować najlepsze takie kody: za pomocą drzewa.

Ile razy występuje każdy znak
Budowa drzewa

Zakodowany tekst (kolejne znaki na zmianę w kolorach)

3. Wyrzuć to, czego nie widać: JPG

stratna

JPG dzieli zdjęcie na kwadraty 8 × 8 pikseli i w każdym zapisuje głównie ogólny kształt jasności, a drobne szczegóły zaokrągla albo wyrzuca. To prawdziwy algorytm JPG (transformata DCT i kwantyzacja), uproszczony do jednego kroku. Zmniejsz jakość i zobacz, co się dzieje.

Jakość50
Oryginał
Po kompresji

Co się lepiej skompresuje?

Punkty 0 · Seria 0 · Rekord 0

Co to jest kompresja danych?

Kompresja bezstratna

Kompresja to zapisywanie danych tak, żeby zajmowały mniej miejsca. Kompresja bezstratna pozwala odtworzyć plik co do bitu. Tak działają archiwa ZIP, obrazki PNG i dźwięk FLAC. Wykorzystuje powtórzenia i to, że niektóre znaki występują częściej niż inne.

Kodowanie RLE

Najprostsza metoda: serię takich samych elementów zapisuje się jako „ile razy” i „co”. Napis AAAAAABBB staje się 6A3B. RLE świetnie działa dla prostych grafik z dużymi jednolitymi plamami, ale przy zdjęciach i szumie potrafi powiększyć plik.

Kodowanie Huffmana

Częste znaki dostają krótkie kody, a rzadkie długie. Kody odczytuje się z drzewa, które buduje się, łącząc za każdym razem dwa najrzadsze elementy. Żaden kod nie jest początkiem innego, więc nie potrzeba przerw między znakami, inaczej niż w alfabecie Morse'a. Kodowanie Huffmana jest częścią formatów ZIP, PNG, JPG i MP3.

Kompresja stratna

Kompresja stratna celowo wyrzuca część informacji, której człowiek nie zauważy. Pliku nie da się już odtworzyć idealnie, ale bywa nawet dziesięć razy mniejszy. Tak działają JPG (zdjęcia), MP3 i AAC (muzyka) oraz MP4 (filmy).

Jak działa JPG?

Zdjęcie dzieli się na bloki 8 × 8 pikseli. Każdy blok zamienia się na zestaw „wzorów” od gładkich do bardzo drobnych (transformata DCT). Drobne wzory oko słabo widzi, więc zaokrągla się je mocno albo do zera. Przy niskiej jakości widać wtedy charakterystyczne „kafelki”.

Czy da się skompresować plik ZIP drugi raz?

Prawie wcale. Dobrze skompresowane dane nie mają już powtórzeń ani przewidywalnych wzorów, więc kolejna kompresja nie ma czego skrócić. Z tego samego powodu ZIP z plikami JPG albo MP3 jest niewiele mniejszy od samych plików.

Popularne formaty i rodzaj kompresji

Popularne formaty plików, rodzaj kompresji i zastosowanie
FormatRodzajDo czegoJak mniej więcej działa
ZIP, 7zbezstratnadowolne pliki, archiwaszukanie powtórzeń + kodowanie Huffmana
PNGbezstratnagrafiki, zrzuty ekranu, logoprzewidywanie pikseli + powtórzenia + Huffman
GIFbezstratna (do 256 kolorów)proste animacjesłownik powtarzających się ciągów (LZW)
JPGstratnazdjęciabloki 8 × 8, DCT, kwantyzacja, Huffman
MP3, AACstratnamuzykausuwanie dźwięków, których ucho nie słyszy
MP4 (H.264)stratnafilmyzapisywanie tylko zmian między klatkami
FLACbezstratnamuzyka w wysokiej jakościprzewidywanie kolejnych próbek dźwięku

Najczęstsze pytania o kompresję

Co to jest kompresja danych?

Kompresja to zapisanie danych w sposób, który zajmuje mniej miejsca niż oryginał. Dzięki niej pliki szybciej się przesyła i mniej zajmują na dysku. Przed użyciem skompresowane dane trzeba rozpakować, czyli zdekompresować.

Czym różni się kompresja stratna od bezstratnej?

Kompresja bezstratna pozwala odtworzyć dane dokładnie co do bitu (ZIP, PNG, FLAC). Kompresja stratna wyrzuca część informacji, której człowiek nie zauważy, więc plik jest mniejszy, ale nie identyczny z oryginałem (JPG, MP3, MP4).

Na czym polega kodowanie RLE?

RLE zastępuje serię powtarzających się elementów jednym zapisem: liczbą powtórzeń i elementem. Na przykład AAAAABB zapisuje się jako 5A2B. Metoda jest skuteczna, gdy w danych jest dużo długich serii.

Na czym polega kodowanie Huffmana?

Każdy znak dostaje kod zero-jedynkowy, którego długość zależy od tego, jak często znak występuje: częste znaki mają krótkie kody, a rzadkie długie. Kody odczytuje się z drzewa budowanego przez wielokrotne łączenie dwóch najrzadszych elementów.

Dlaczego zdjęcia JPG mają czasem „kwadraty”?

JPG kompresuje zdjęcie w blokach 8 × 8 pikseli. Przy niskiej jakości każdy blok jest mocno uproszczony niezależnie od sąsiadów, więc na granicach bloków widać skoki jasności, czyli charakterystyczne kafelki.

Czy można skompresować każdy plik?

Nie. Dane losowe albo już skompresowane nie mają powtórzeń, które dałoby się skrócić. Matematycznie nie istnieje metoda bezstratna, która zmniejsza każdy możliwy plik: jeśli jedne pliki się skracają, to inne muszą się wydłużyć.

Kiedy używać PNG, a kiedy JPG?

PNG nadaje się do grafik z ostrymi krawędziami, tekstem i jednolitymi kolorami, np. zrzutów ekranu i logo. JPG jest lepszy do zdjęć, w których jest mnóstwo płynnych przejść i drobnych szczegółów.