Główną motywacją dla formatu PNG było stworzenie zamiennika dla GIF-a, który byłby nie tylko darmowy, ale również ulepszenie w stosunku do niego zasadniczo pod każdym względem. W rezultacie kompresja PNG jest całkowicie bezstratna - to znaczy oryginalne dane obrazu mogą być odtwarzane dokładnie, bit po bicie - tak jak w GIF i większości form TIFF.
PNG wykorzystuje 2-etapowy proces kompresji:
- Kompresja wstępna: filtrowanie (prognoza)
- Kompresja: DEFLATE (patrz wikipedia )
Etap wstępnej kompresji nazywa się filtrowaniem, czyli metodą odwracalnej transformacji danych obrazu, dzięki czemu główny silnik kompresji może działać wydajniej.
Jako prosty przykład rozważ sekwencję bajtów równomiernie rosnącą od 1 do 255:
1, 2, 3, 4, 5, .... 255
Ponieważ w sekwencji nie ma powtórzeń, kompresuje się albo bardzo słabo, albo wcale. Ale trywialna modyfikacja sekwencji - mianowicie pozostawienie pierwszego bajtu w spokoju, ale zastępowanie każdego kolejnego bajtu różnicą między nim a jego poprzednikiem - przekształca sekwencję w niezwykle ściśliwy zestaw:
1, 1, 1, 1, 1, .... 1
Powyższa transformacja jest bezstratna, ponieważ nie pominięto bajtów i jest całkowicie odwracalna. Skompresowany rozmiar tej serii zostanie znacznie zmniejszony, ale oryginalną serię nadal można doskonale odtworzyć.
Rzeczywiste dane obrazu rzadko są tak doskonałe, ale filtrowanie poprawia kompresję obrazów w skali szarości i trójwymiarowych, a także może pomóc w niektórych obrazach paletowych. PNG obsługuje pięć typów filtrów, a koder może wybrać inny filtr dla każdego rzędu pikseli na obrazie:
Algorytm działa na bajtach, ale w przypadku dużych pikseli (np. 24-bitowy RGB lub 64-bitowy RGBA) porównywane są tylko odpowiadające bajty, co oznacza, że czerwone komponenty kolorów pikseli są obsługiwane osobno od zielonych i niebieskich pikseli.
Aby wybrać najlepszy filtr dla każdego wiersza, koder musiałby przetestować wszystkie możliwe kombinacje. Jest to oczywiście niemożliwe, ponieważ nawet 20-wierszowy obraz wymagałby przetestowania ponad 95 bilionów kombinacji, przy czym „testowanie” wymagałoby filtrowania i kompresji całego obrazu.
Poziomy kompresji są zwykle definiowane jako liczby od 0 (brak) do 9 (najlepszy). Odnoszą się one do kompromisów między prędkością a rozmiarem i odnoszą się do liczby kombinacji filtrów wierszy, które należy wypróbować. Nie ma żadnych standardów dotyczących tych poziomów kompresji, więc każdy edytor obrazów może mieć własne algorytmy określające, ile filtrów należy wypróbować, optymalizując rozmiar obrazu.
Poziom kompresji 0 oznacza, że filtry w ogóle nie są używane, co jest szybkie, ale marnotrawstwo. Wyższe poziomy oznaczają, że coraz więcej kombinacji jest wypróbowywanych w wierszach obrazu i zachowywane są tylko te najlepsze.
Sądzę, że najprostszym podejściem do najlepszej kompresji jest stopniowe testowanie kompresji każdego wiersza z każdym filtrem, zapisanie najmniejszego wyniku i powtórzenie dla następnego wiersza. Sprowadza się to do pięciokrotnego filtrowania i kompresji całego obrazu, co może być rozsądnym kompromisem dla obrazu, który będzie transmitowany i dekodowany wiele razy. Niższe wartości kompresji zrobią mniej, według uznania twórcy narzędzia.
Oprócz filtrów, poziom kompresji może również wpływać na poziom kompresji zlib, który jest liczbą od 0 (bez deflacji) do 9 (maksymalna deflacja). Jak określone poziomy 0–9 wpływają na użycie filtrów, które są główną funkcją optymalizacji PNG, nadal zależy od autora narzędzia.
Wniosek jest taki, że PNG ma parametr kompresji, który może znacznie zmniejszyć rozmiar pliku, a wszystko to bez utraty nawet jednego piksela.
Źródła:
Dokumentacja libpng Wikipedii Portable Portable Graphics
Rozdział 9 - Kompresja i filtrowanie