Blog (57)
Komentarze (10k)
Recenzje (1)
@BerionMit kompresji stratnej

Mit kompresji stratnej

01.08.2017 03:12, aktualizacja: 02.08.2017 22:25

Określenie „kompresja stratna” uważam za toksyczne, szkodliwe i siejące zamęt w głowach nie tylko tzw. niedzielnych użytkowników komputera, ale nawet ludzi którzy zawodowo zajmują się grafiką komputerową, cyfrową archeologią, programistów etc. Dlaczego to jest mit, dlaczego powoduje problemy w interpretacji i czemu należałoby porzucić ten termin, postaram się pokazać na kilku przykładach.

Czym w ogóle jest kompresja?

Jest to zmniejszenie rozmiaru pliku przez skrócenie powtarzalnych sekwencji danych. Choć brzmi to trochę enigmatycznie, jest bardzo łatwe do zrozumienia. Z lekcji matematyki na pewno pamiętasz, że działania można upraszczać. W podobny sposób postępuje się z danymi kiedy kompresor natrafia np. na ciąg samych zer. Na przykład jeśli plik zawiera takie oto dane (przedstawiając w jedynym czytelnym dla człowieka systemie szesnastkowym):

628018

Można je ścisnąć do postaci, w której pierwsze siedem bajtów jest ciągiem liczb naturalnych „od do”, a ostatnie dziesięć samymi zerami, używając stosownych znaczników dla danego formatu kompresji, które to z kolei są informacją dla dekompresora w jaki sposób przywrócić pierwotną formę danych sprzed kompresji. Oczywiście to ogromne uproszczenie całego procesu ponieważ algorytmy są znacznie bardziej skomplikowane niż to co opisałem. Istotne jest abyś wiedział jak to mniej więcej działa (dociekliwych odsyłam do lektury np. o algorytmach LZ, rodziny która obecnie dominuje w IT).

Spostrzegawczy złośliwy zwróci uwagę na fakt, że powyższy opis mieści się w definicji „kompresji bezstratnej”. I wszystko się zgadza poza semantyką. Kompresja nie może być stratna bo jaki sens byłby np. w pakowaniu plików, kiedy po rozpakowaniu otrzymywałoby się uszkodzone, niepełne dane? Dosłownie żaden.

Kompresja może zachodzić:

  1. Wewnątrz kontenera z tzw. wirtualnym systemem plików, kompresując wszystkie lub tylko wybrane jego elementy. Tak kompresuje np. WinRAR, 7-ZIP i prawdopodobnie wszystkie pozostałe archiwizery
  2. Wewnątrz kontenera bez VFS, ale z jasno określoną strukturą (która może być choćby tylko samą kolejnością i poprzedzającymi kolejne elementy nagłówkami). Takimi kontenerami są np. TIFF z kompresją LZW lub PDF z kompresją ZIP (Deflate), a także mnóstwo kontenerów zaprojektowanych przez twórców gier.
  3. Wewnątrz formatu pliku, czyli najczęściej wszystko poza samym nagłówkiem. Tak kompresują głównie programy graficzne w formatach gdzie ta kompresja faktycznie występuje np. Paint zapisujący do PNG, Gimp zapisujący do TGA z kompresją RLE etc.
  4. Na poziomie systemu plików, czyli przewidzianą w specyfikacji i wykorzystywaną np. na żądanie użytkownika. Przykłady: NTFS i kompresja danych LZNT1, ZFS i kompresja np. LZ4, BTRFS i np. LZO.
  5. Na poziomie abstraktów systemu plików, czyli kompresując cały plik np. za pomocą programów gzip, bzip2 etc.

Kompresja w formatach graficznych

Z pewnością dla wszystkich synonimem „kompresji stratnej” jest JPEG. Ten rewolucyjny i rewelacyjny jak na swoje czasy format, do dziś nie daję się wyprzeć i jest obsługiwany przez niemal wszystkie urządzenia multimedialne. Od odtwarzaczy DVD pod telewizorem, przez telefony, tablety, a nawet konsole do gier.

Każda szanująca się aplikacja umożliwiająca zapis pliku graficznego do *.jpg, pozwala m.in. na wybór, no właśnie… stopnia kompresji (najczęściej za pomocą suwaka i na szczęście już coraz rzadziej tak nazwana) lub jeśli format docelowy obsługuje kilka algorytmów to i JPG znajdzie się na liście. Dzięki takiej niedbałości i uproszeniom, „kompresja stratna” już chyba na zawsze weszła do słownika każdego użytkownika komputera. I o ile kiedyś miało to nawet jako taki sens (sprzęt był za słaby aby w czasie rzeczywistym bez zauważalnych opóźnień „rozpakować” plik, więc kompresji nie używało się nigdzie na desktopach poza archiwizacją danych), tak dzisiaj powoduje cały szereg nieporozumień.

Konwersja to nie kompresja

Kiedy np. profesjonalny fotograf otwiera swój plik z negatywem, dokonuje poprawek i retuszu by ostatecznie zapisać dla klienta zdjęcie w JPG, to dokonuje konwersji do tegoż właśnie formatu. Nic nie ulega tam kompresji, i nie dość że dochodzi do redukcji wielu informacji o zdjęciu, które zostają bezpowrotnie utracone, to na dodatek zostaje ono całkowicie przetworzone.

Na poniższym, specjalnie trzykrotnie powiększonym (metodą najbliższy sąsiad) przykładzie świetnie to widać. Obraz po prawej został całkowicie zmodyfikowany (widoczne zniekształcenia i podział na kwadraty), można nawet powiedzieć że zniszczony i nie będzie już możliwy do odtworzenia ten pierwotny z lewej strony.

628029

Oczywiście powyższy przykład został specjalnie spreparowany aby możliwie jak najwyraźniej pokazać wynik konwersji. Przy zapisie do JPEG na możliwie najlepszym współczynniku zachowania jakości, przy tak dużym zagęszczeniu pikseli na ekranach telefonów czy nawet przy wielokrotnie wyższych rozdzielczościach wykonanych zdjęć w stosunku do rozdzielczości np. telewizora, który będzie musiał je przeskalować, „wojna mrówek” i „kwadratyzacja” ulegają zatarciu, przez co na pierwszy rzut oka stają się kompletnie niezauważalne. Na tym zresztą polega fenomen JPEG bo przy niewielkiej wadze pliku, w dalszym ciągu obraz jest zadowalający dla większości użytkowników.

Redukcja kolorów to nie kompresja

Zapisując obraz wykorzystujący możliwie pełną paletę kolorów (np. 24bit) do obrazu wykorzystującego np. 256 kolorów (8bit), z oczywistych względów bezpowrotnie traci się większość z nich. To również jest konwersja i tak jak w przypadku JPG, cały obraz jest przetwarzany. Aplikacja oblicza zakres kolorów, który będzie możliwie najwierniejszy oryginałowi, a przy tym mieścił się w ustalonej, ograniczonej palecie barw, dla każdego piksela z osobna i zależnie od użytych algorytmów różne programy różnie sobie z tym radzą (z moich doświadczeń najlepiej OPTPIX Image Studio używany głównie podczas tworzenia gier, a sławny Photoshop co najwyżej średnio). Skoro występuje tutaj redukcja kolorów to i redukcja wagi pliku, ale przecież nie przez kompresję, która tutaj nie zachodzi.

628033

Kompresja bitmapy rzeczywistą kompresją

Dawno, dawno temu, pliki graficzne zawierały wyłącznie same dane o wyświetlanych na ekranie pikselach. Pozbawione były jakichkolwiek meta danych, palety kolorów znajdowały się na zewnątrz i były współdzielone z innymi bitmapami, a wszystko to przez ograniczenia sprzętowe (pojemność nośników, przepustowość). Współczesne pliki graficzne posiadają nagłówek opisujący format, paletę lub nawet kilka palet kolorów, czasami stopkę, zaś na środku oczywiście dane bitmapy.

I to właśnie one podlegają kompresji w obrębie danego formatu jak jest w przypadku znanego i coraz popularniejszego PNG. Algorytm (lub algorytmy) są ściśle określone w specyfikacji formatu i każdy program wykonuje ją niezauważalnie dla użytkownika (czasami programy pozwalają na wybór dodatkowych parametrów dotyczących kompresji). Z wyliczanki z pierwszego akapitu jest to dokładnie przypadek numer 3 i jedyny kiedy można mówić o kompresji podczas konwersji, redukcji kolorów i/lub zapisu do innego formatu.

Kompresja w formatach wideo

Analogicznie jak w przypadku plików graficznych (z których przecież składa się każdy film). Struktura każdej klatki jest podobna i wszystko co znajdziesz wyżej, także odnosi się do filmów (m.in. tym właśnie zajmują się tzw. kodeki).

Kompresja w formatach dźwiękowych

W przypadku np. MP3 ponownie „kompresja stratna” zaciemnia znaczenie konwersji z jednego formatu w inny, w tym przypadku uboższy (niższy bitrate, przycięte częstotliwości etc. czyli tzw. downsampling).

Na poniższym przykładzie spektrogramy tego samego utworu, mniej więcej w tym samym momencie, górny przedstawia MP3, dolny FLAC.

628042
628043

Prawdziwy proces kompresji dokonuje się przy zapisie np. do formatu FLAC, w którym „fala” przeżuwana jest przez Deflate, zmniejszając rozmiar bez straty na jakości, a więc możliwa jest także dekompresja do pierwotnej formy.

Podsumowanie

Jak widzisz, wszędzie mechanizm jest ten sam. Tam gdzie zachodzi „kompresja bezstratna”, rzeczywiście zachodzi kompresja, a tam gdzie „kompresja stratna” cały szereg operacji, który z kompresowaniem czegokolwiek nie ma nic wspólnego. Wielka szkoda, że tak wielka zbrodnia na definicjach wdarła się do podręczników i prac. A skoro dotrwałeś do końca mojego wywodu, to mam nadzieję że od teraz nie tylko dostrzegasz różnicę pomiędzy kompresją, a konwersją, ale także rozumiesz że z matematycznego punktu widzenia kompresja stratna nie istnieje. Apeluję więc o uświadamianie nieuświadomionych by już nikt nigdy nie zadał druzgocącego pytania: „czy jeśli spakuję doktorat.doc WinRARem to stracę jakość?”

628047

Jeśli podobał ci się poradnik i chciałbyś od czasu do czasu przeczytać coś podobnego, nie zapomnij zagłosować w konkursie blogowym na początku każdego miesiąca. Dziękuję.

Wybrane dla Ciebie
Komentarze (177)