Formaty obrazu: JPEG

Format JPEG jest najczęściej używanym formatem w internecie i nie bez powodu – od dziesięcioleci jest to niemal niezmiennie odpowiednim wyborem do kodowania zdjęć. Przypadek użycia jest taki sam w nazwie: JPEG to skrót od „joint Photoography Expert Group” (Wspólna grupa ekspertów fotograficznych), komitet odpowiedzialny za pierwsze wydanie standardu w 1992 roku. Rozszerzenie JPEG pojawi się jako .jpg lub .jpeg, chociaż ten drugi rodzaj pliku jest rzadko używany.

Podczas gdy kompresja bezstratna pasywnie kompresuje dane obrazu najlepiej, jak to możliwe, kompresja stratna JPEG szuka możliwości zwiększenia skuteczności kompresji przy drobnych, często niezauważalnych zmianach w danych obrazu. Format JPEG koduje dane obrazu jako 8-8 bloków pikseli i opisuje bloki, a nie poszczególne piksele, które się w nich znajdują, algorytmicznie.

Na papierze może to brzmieć jak charakterystyczne, akademickie rozróżnienie: „GIF używa siatki złożonej z pikseli, a JPEG używa siatki złożonej z mniejszych siatki pikseli”. W praktyce takie użycie bloków zamiast pikseli oznacza, że format JPEG pasuje do znacznie bardziej typowych zastosowań obrazów: subtelnych, warstwowych gradientów tworzących prawdziwe zdjęcie.

Wyrównanie zielonych bloków w poziomie od jasnego do ciemnego.

Nawet bardzo prosty gradient z jednym pikselem przy użyciu kodowania w stylu GIF byłby bardzo szczegółowy:

Wiersz 1, kolumny od 1 do 9 mają wartość #00CC00. Pierwszy wiersz, kolumna 10 to #00BB00. Wiersz 1, kolumna 11 to #00AA00. Pierwszy wiersz, 12. kolumna to #009900. Wiersz 1, kolumna 13 to numer 008800. Pierwszy wiersz, czternasta kolumna to #007700. Wiersz 1, 15 kolumna to #006600. Wiersz 1, kolumna 16 to numer 005500.

Opisanie gradientu za pomocą kodowania w stylu JPEG jest znacznie wydajniejsze:

Siatka zielonych bloków o wymiarach 8 na 16 z różnych odcieni od jasnego do ciemnego.

Pierwszy blok to #00CC00. Blok 2 to gradient od #00CC00 do #005500.

JPEG najbardziej wyróżnia się w zakresie kwantyfikacji poziomu szczegółów „wysokiej częstotliwości” obrazu, często niedostrzegalnej. W rezultacie zapisanie obrazu jako pliku JPEG zwykle oznacza obniżenie jego jakości w sposób mierzalny, ale niekoniecznie widoczny. Jak już wiesz, kwantyfikacja palet w stylu GIF jest stosunkowo prosta: zmniejszenie liczby kolorów na obrazie powoduje powstawanie mniejszych plików, ale łatwe do zauważenia dla ludzkiego oka.

Z kolei format JPEG sprytnie podchodzi do kwantyzacji: to metoda destrukcyjnej kompresji JPEG, której celem jest kwantyfikacja źródła obrazu w sposób luźno dopasowany do sposobu, w jaki nasze systemy psychowizualne kwantyzują otaczający nas świat. W efekcie JPEG próbuje pominąć szczegóły, których nie dało się wcześniej dostrzec, dzięki czemu staje się dzięki temu dodatkową kompresją.

Ludzki system psychowizualny robi to w dużym stopniu, aby „kompresować” obrazy, które stale odbierasz. Gdy patrzę na ogródek, mogę natychmiast przetworzyć ogromną ilość informacji: na przykład wyjątkowe kwiaty w jasnych kolorach. Od razu wykrywam, że ziemia jest szara, opadające liście, a moje rośliny potrzebują wody. To, co widziałem, ale nie do końca przetwarzam, to dokładny kształt, rozmiar, kąt i odcień zieleni dla każdego spadającego liści. Mogę oczywiście aktywnie szukać tych szczegółów, ale byłoby to po prostu za dużo informacji do biernego przyjmowania i nie przynosiłoby żadnych rzeczywistych korzyści. Mój system psychowizualny przeprowadza własną kwantyzację i przekształca te informacje do „opadających liści”.

Oznacza to, że format JPEG działa w ten sam sposób. Kompresja stratna JPEG zmniejsza poziom szczegółów obrazu w sposób, który może nie zarejestrować się w naszych naturalnie „stratnych” systemach psychowizualnych, jeśli zostanie przetworzony w odpowiedni sposób. Daje również większe możliwości oszczędności przepustowości niż sama bezstratna kompresja.

Na przykład format JPEG wykorzystuje jedną z naszych głównych psychowizualnych słabości: nasze oczy są bardziej wrażliwe na różnice w jasności niż w barwie. Przed zastosowaniem jakiejkolwiek kompresji pliki JPEG stosują proces nazywany „dyskretną transformacją cosinusową”, aby podzielić obraz na oddzielne częstotliwości, czyli „warstwy”, reprezentujące luminancję (jasność) i chrominancję (kolor) lub „luminancję” i „kolor”.

Warstwa luma jest minimalnie kompresowana, pomijając tylko drobne szczegóły, które są prawdopodobnie niezauważalne dla ludzkiego oka.

Warstwy kolorów są znacznie ograniczone. Zamiast prostego kwantyzacji palety warstw chromatycznych, takich jak GIF, JPEG może wykonać proces nazywany „podpróbkowaniem”, w którym warstwa kolorów jest przechowywana w niższej rozdzielczości. Po połączeniu z skutecznym rozciągnięciem warstw chromatycznych o niższej rozdzielczości na warstwę luma różnica jest często niezauważalna. Niewielkie różnice w odcieniach mogą być zauważalne, jeśli porównamy oryginalne zdjęcie źródłowe i plik JPEG obok siebie, ale tylko wtedy, gdy dokładnie wiemy, czego szukać.

W tym przypadku plik JPEG nie jest doskonały. Choć sprytny format JPEG polega na uciekaniu przed kompresją, staje się to oczywiste, jeśli za bardzo się posuniesz. Jeśli spędzasz dużo czasu w internecie, zwłaszcza w ostatnich dniach, możesz zauważyć, że kompresja JPEG jest za daleko zajęta:

Wysoko skompresowany obraz kwiatów z wieloma artefaktami wizualnymi.

Zbyt agresywne kompresowanie danych obrazu powoduje, że poziom szczegółowości jest bardziej ograniczony niż nasze systemy psychowizualne w naturalny sposób ignorowania tego typu treści, więc iluzje jest przerywane. Oczywistym jest brak szczegółów. Ponieważ format JPEG działa jak bloki, mogą zacząć się pojawiać połączenia między nimi.

Progresywne JPEG

Progresywne pliki JPEG (PJPEG) skutecznie zmieniają kolejność renderowania plików JPEG. Pliki JPEG „podstawowe” są renderowane od góry do dołu w miarę postępów transferu, a progresywne pliki JPEG dzielą renderowanie w zestaw pełnowymiarowych „skanowań” – podobnie jak wykonane od góry do dołu – a każde skanowanie zwiększa jakość obrazu. Od razu pojawia się całe zdjęcie, choć jest nieostre, i staje się coraz bardziej wyraźne w miarę przenoszenia.

GIF przedstawiający szybszą szybkość wczytywania progresywnego JPEG w porównaniu ze zwykłym plikiem JPEG.

Wydaje się, że w perspektywie papieru może to być znacząca różnica techniczna, ale daje ona ogromne korzyści także percepcyjne: ponieważ od razu zamiast pustej przestrzeni znajduje się pełnowymiarowy obraz, plik PJPEG może poczuć się szybciej niż w przypadku podstawowego pliku JPEG. Poza tym, z wyjątkiem najmniejszych obrazów, kodowanie obrazu w formacie PJPEG niemal zawsze oznacza mniejszy rozmiar pliku w porównaniu z podstawowym plikiem JPEG – niewiele, ale każdy bajt pomaga.

Występuje jednak jeden drobny kompromis: dekodowanie pliku PJPEG jest bardziej złożone po stronie klienta, co oznacza, że podczas renderowania niewielkie obciążenie przeglądarki i sprzętu urządzenia. Trudno jest dokładnie oszacować nakłady pracy związane z renderowaniem, ale jest ono bardzo niewielkie i prawdopodobnie niezauważalne, z wyjątkiem urządzeń o mocno słabej mocy. Jest to kompromis, który warto wykonać. Mówiąc w skrócie, metoda progresywna to rozsądna metoda kodowania obrazu w formacie JPEG.

Używanie formatu JPEG

Możecie się dziwić, że wszystkie te informacje przytłaczają. Mamy jednak dobre wieści na temat codziennej pracy: bardziej techniczne specyfikacje kompresji JPEG są wyodrębnione i są widoczne jako pojedyncze ustawienie jakości: liczba całkowita z zakresu od 0 do 100. Wartość 0 oznacza najmniejszy możliwy rozmiar pliku i, jak można by się spodziewać, najgorszą możliwą jakość obrazu. W miarę przechodzenia od 0 do 100 rośnie zarówno jakość, jak i rozmiar pliku. To ustawienie jest oczywiście subiektywne – nie każde narzędzie interpretuje wartość „75” w ten sam sposób, a jakość percepcyjna zależy od zawartości obrazu.

Aby zrozumieć, jak działa to ustawienie kompresji, skorzystajmy z popularnego narzędzia internetowego do optymalizacji plików graficznych: Squoosh.

Aplikacja Squoosh obsługiwana przez zespół Chrome umożliwia bezpośrednie porównanie różnych metod kodowania i konfigurowania danych wyjściowych obrazu oraz oferuje różne opcje konfiguracji, od globalnego suwaka jakości w skali 0–100 po możliwość precyzyjnego dostosowania ustawień chrominancji i luminancji. Im mniejsza wartość „jakości”, tym większa kompresja i tym mniejszy plik wynikowy.

Panel ustawień Squoosh z wyróżnionym suwakiem jakości.

Jeśli ustawisz „jakość” na 60, rozmiar pliku zostanie zmniejszony o 79%. Nie daj się zwieść konsekwencji tej etykiety: różnice w jakości w większości skali będą niezauważalne dla ludzkiego oka, nawet podczas porównywania.

Aby przekonwertować obraz źródłowy do formatu progresywnego JPEG, zaznacz pole „Renderowanie progresywne” w sekcji „Opcje zaawansowane”. Niektóre z tych opcji konfiguracji prawie na pewno zapewniają bardziej szczegółowe informacje, niż wymaga to przeciętny projekt internetowy, ale mogą one pokazać, jak w praktyce wykorzystujesz wiedzę o wpływie zdobytej wiedzy na temat kodowania JPEG na rozmiar i jakość pliku w rzeczywistych zastosowaniach.

Panel ustawień Squoosh z wyróżnionym ustawieniem renderowania progresywnego.

Praktycznie nie ma na ten temat zbyt wielu informacji, mimo że obecnie wiemy, że format JPEG ma charakter wewnętrzny. Squoosh to tylko jedna z niezliczonych metod zapisywania zoptymalizowanych plików JPEG. Wszystkie stosują podobną metodę określania poziomu kompresji: pojedynczą liczbę całkowitą z zakresu od 0 do 100.

Ustalenie idealnego poziomu kompresji obrazów jest bardzo trudne, ponieważ złożoność kodowania JPEG składa się z jednej liczby całkowitej, zwłaszcza gdy tak wiele zależy od treści obrazu. Ustawienia kompresji JPEG zmieniają sposób, w jaki postrzegamy te obiekty.

Po opisaniu wszystkiego na zewnątrz moje zdolności psychowizualne stały się bardziej ręczne – teraz patrzę na pojedyncze liście, chociaż sam obraz (można powiedzieć, że się nie zmienił). Dlatego skonfigurowanie kompresji JPEG to nie lada wyzwanie: dokładnie wiesz, na jakie wady wizualne zwrócić uwagę. Jeśli weźmiemy pod uwagę kompresję obrazu, to skupiamy się na pojedynczych liściach, ponieważ często zauważymy niewielkie rozmycie i rzadkie artefakty kompresji. Im dłużej szukasz artefaktów podczas dostrajania ustawień kompresji JPEG, tym większe prawdopodobieństwo, że je znajdziesz, podczas gdy użytkownicy ich nie znajdą. Nawet jeśli taki użytkownik dokładnie wiedział, czego szuka, raczej nie odwiedzi strony z kompresją JPEG.

Dlatego nie staraj się przeskalować obrazu w poszukiwaniu artefaktów. Nie musisz też przyglądać się dokładnie częściom obrazów, w których artefakty pojawią się jako pierwsze. Dla użytkowników delikatne artefakty wtapiają się w drobne szczegóły, które ich stratne systemy psychowizualne zwykle błyszczą. Nawet jeśli wiesz, jakie sztuczki ma wykonać JPEG, nie zauważysz tych samych artefaktów podczas przeglądania internetu, chyba że będziesz ich szukać. Z tego względu niemal zawsze warto zwiększyć kompresję JPEG trochę mniejszą, niż Ci się wydaje – zwłaszcza wtedy, gdy obraz będzie wyświetlany mniejszy od jego wewnętrznego rozmiaru, wynikający z bezpośredniego stylu lub ograniczeń nałożonych przez układ otoczenia.