Podczas eksportowania obrazów czy ten suwak jakości JPEG zawsze traktujesz jak procenty? Przesuwasz na 80 i myślisz: „zachowałem osiemdziesiąt procent jakości”; ustawiasz 100 i myślisz: „teraz nic nie zostało utracone”.
To rozumienie trzeba w całości odrzucić: liczby na suwaku nie mają nic wspólnego z „jakim procentem jakości”, a jakość 100 nie jest bezstratna. Najpierw praktyczne wnioski — jeśli chcesz bezpiecznie zapisywać zdjęcia, ustaw 85–92; do publikacji w sieci i mediach społecznościowych wystarczy 75–82; nie ustawiaj 100 jako wartość domyślną, bo tylko podwoi, a nawet potroi rozmiar pliku, nie dodając ani trochę jakości. Poniżej wyjaśnię to prostym językiem i rozłożę ten suwak na części.
W jednym zdaniu: suwak jakości JPEG nie kontroluje „ile jakości zostaje zachowane”, lecz to, jak agresywne są dzielniki w tabeli kwantyzacji — im większe dzielniki, tym ostrzejsze zaokrąglanie i tym więcej danych zostaje utraconych. Nie ma liniowego związku ani z jakością obrazu, ani z rozmiarem pliku; zmiana ze 100 na 90 to nie to samo co zmiana z 20 na 10.
Zacznijmy od założenia: JPEG to format stratny. Od chwili, gdy naciskasz „zapisz”, traci dane; suwak decyduje tylko, „jak mocno traci”, a nie „czy traci”. Proces utraty danych ma ustalony przebieg, a suwak jest ostatnią bramką na tej linii.
Podczas zapisu obraz najpierw jest konwertowany z RGB do YCbCr, rozdzielając jasność i kolor na dwa kanały. Dzieje się tak, ponieważ ludzkie oko znacznie lepiej dostrzega jasność niż kolor; rozdzielenie ich ułatwia późniejsze skupienie się na zachowaniu jasności.
Następnie cały obraz jest dzielony na małe bloki 8×8 pikseli, a każdy blok przechodzi dyskretną transformację kosinusową (DCT), która zamienia kolory pikseli na ciąg wartości częstotliwości. Można to porównać do rozkładania akordu na pojedyncze dźwięki: niskie częstotliwości to bazowe kolory i gradienty obrazu, a wysokie to ostre krawędzie i drobne tekstury. Pełny opis tego procesu znajduje się w haśle JPEG w Wikipedii.
Prawdziwy cios następuje w ostatnim kroku: każda wartość częstotliwości jest dzielona przez liczbę z tabeli kwantyzacji (Quantization Table), a następnie zaokrąglana do liczby całkowitej. Zaokrąglanie to miejsce, w którym informacja ginie na zawsze — reszty z dzielenia są po prostu odrzucane i nie da się ich odzyskać. Suwak jakości kontroluje właśnie to, jak agresywne są te dzielniki: wysoka wartość suwaka oznacza małe dzielniki, więc zaokrąglanie prawie nie uszkadza danych; niska wartość oznacza duże dzielniki, a zaokrąglanie po prostu wygładza szczegóły. Dzielniki dla wysokich częstotliwości rosną jednak szybciej, dlatego za każdym razem pierwsze poświęcane są krawędzie i drobne tekstury.
Dlatego nie może być traktowany jak procent. Przejście ze 100 na 90 i z 20 na 10 to zupełnie inne zmiany dzielników, a różnice w jakości obrazu i rozmiarze pliku również są zupełnie inne — przy 90 przesunięcie o jedną działkę może być niezauważalne; przy 20 przesunięcie o jedną działkę niszczy obraz. Traktowanie go jako procent to najczęstsze i najkosztowniejsze nieporozumienie dotyczące tego suwaka.
Najpierw odpowiedź: jakość 100 od bezstratności dzielą dwie poważne wady — jedna nie zależy od ustawienia suwaka, a na drugą suwak nie ma żadnego wpływu.
Pierwszą jest podpróbkowanie chrominancji (chroma subsampling). Po konwersji RGB do YCbCr, a przed rozpoczęciem właściwej kompresji, większość koderów odrzuca około 75% szczegółów chrominancji. Powód jest wciąż ten sam: ludzkie oko jest mało wrażliwe na kolor, więc nie zauważy ich utraty. Ten krok w ogóle nie podlega suwakowi; nawet przy ustawieniu 100 zostanie wykonany.
Druga wada to sama matematyka, która nie jest „czysta”. Nawet jeśli dzielniki w tabeli kwantyzacji są ustawione na minimum, przejście „piksele na częstotliwości, a częstotliwości z powrotem na piksele” nadal wprowadza drobne błędy zaokrągleń. Po otwarciu zapisanego pliku nie są to już te same piksele, które były w chwili naciśnięcia przycisku zapisu.
Jeśli naprawdę chcesz nie stracić ani jednego bitu, wybierz format bezstratny: PNG, TIFF albo tryb bezstratny WebP. Kompresja stratna to droga jednokierunkowa; dotyczy to każdego ustawienia JPEG, również tego wyglądającego na „idealne” 100.
Liczne testy i porównania na poziomie pikseli prowadzą w końcu do bardzo wyraźnego podziału: dwa przedziały pokrywają niemal wszystkie scenariusze.
85–92 to ustawienie zachowawcze. Portfolio, zdjęcia oddawane klientom, te oryginały, których nie chcesz tknąć — ustaw je w tym zakresie. Plik zapisany z jakością 90 zajmuje od 1/8 do 1/12 rozmiaru nieskompresowanego obrazu, a różnicy nie widać gołym okiem — trzeba powiększyć do 400% i wpatrywać się w jakiś mały fragment, żeby dostrzec zmianę.
75–82 to ustawienie internetowe. Obrazy na strony, publikacje w mediach społecznościowych — ustaw je w tym zakresie. Pliki są o 40%–60% mniejsze niż w ustawieniu zachowawczym, a kosztem jest głównie lekkie zmiękczenie w miejscach o złożonych teksturach, czego przy normalnym oglądaniu praktycznie nie widać.
Jeśli znasz mój poprzedni tekst „Stratne i bezstratne”, podany tam optymalny zakres 80–85 dobrze się z nimi zgadza: okolice 80 mieszczą się w zakresie internetowym, a 85 właśnie wchodzi w zakres zachowawczy; obrazów zapisanych już z ustawieniem 80–85 nie trzeba ponownie kompresować.
Trzy zakresy w jednym zdaniu: rzeczy, które chcesz zachować, ustawiaj na 85–92; rzeczy wysyłane dalej na 75–82; poniżej 60 to pole minowe — omijaj z daleka.
Domyślne ustawienie 100 przy eksporcie to lęk, nie strategia. Plik z jakością 85 jest o 60%–75% mniejszy niż plik z jakością 100, a mimo to nie widać żadnej różnicy w jakości obrazu; w przypadku stron internetowych to po prostu niepotrzebne wydłużanie czasu ładowania — ten rachunek dla obrazów na stronach szczegółowo policzyłem w tekście o przyspieszaniu obrazów w sieci.
Gdy suwak schodzi poniżej 60, jakość obrazu nie stacza się po zboczu, lecz spada z klifu.
Przyczyna to znowu zaokrąglanie. Przy zbyt niskich wartościach dzielniki dla wysokich częstotliwości stają się absurdalnie duże; wartość częstotliwości po podzieleniu i zaokrągleniu spada bezpośrednio do zera — taki szczegół jest równoznaczny z niezapisaniem go. Wtedy całe kategorie informacji wizualnych znikają masowo: włosy, splot tkaniny, końcówki kresek w czcionkach szeryfowych — to one znikają jako pierwsze.
To, co zostaje, to standardowe artefakty JPEG: widoczne bloki 8×8, pasmowanie (banding) w gradientach, postrzępione krawędzie i szum komarów (mosquito noise) wokół ostrych krawędzi. Duże kształty wciąż są, ale tego obrazu nie można już uznać za „obraz do oglądania przez człowieka”. O tym, skąd bierze się każdy z tych artefaktów, napisałem osobny ilustrowany tekst.
Dlatego mój wniosek jest taki: 60 to praktyczna dolna granica dla zwykłych obrazów. Kilka KB zaoszczędzonych poniżej tego progu daje efekt, który na pierwszy rzut oka wygląda fałszywie — nie warto.
„Jakość 90” nie jest uniwersalną walutą. Specyfikacja JPEG podaje zestaw zalecanych tabel kwantyzacji (Annex K), ale to, której tabeli używa każdy program i jak ją skaluje, zależy od danego oprogramowania. Przy tej samej „wysokiej jakości” cztery popularne narzędzia podają zupełnie różne liczby: skala Photoshopa to 0–12, a jego 10 odpowiada mniej więcej wartości 90 w referencyjnej implementacji libjpeg; GIMP i ImageMagick mają skalę 1–100, przy czym tryb „wysokiej jakości” w GIMP-ie przyjmuje 85, a w ImageMagicku 92; libjpeg jako implementacja referencyjna ma własny punkt odniesienia: 90.
Jeśli w dwóch programach ustawisz „jakość 85”, wyeksportowane pliki i tak nie będą takie same. Nie zapamiętuj więc jednej liczby w jednym programie i nie przenoś jej bezmyślnie do innego. Przy porównywaniu między programami i projektami są tylko dwa niezawodne sposoby: patrzeć na rzeczywisty rozmiar wynikowego pliku i na rzeczywisty wygląd obrazu.
Suwak bywa zawodny, a oko zależy od ekranu i od tego, jak bardzo jesteś zmęczony — czy „nie widać różnicy” można jeszcze jakoś zmierzyć? Tak — znacznie pewniejsza jest inna miara: wskaźnik podobieństwa strukturalnego (SSIM, Structural Similarity Index Measure).
Nie porównuje pikseli po kolei, lecz sprawdza, jak bardzo zmieniły się trzy rzeczy: struktura, jasność i kontrast. Jest to bliższe temu, jak ludzkie oko ocenia obraz, niż „policzenie, ile pikseli się różni”. Wynik mieści się w zakresie od 0 do 1, gdzie 1 oznacza, że dwa obrazy są identyczne. Wzór i wyjaśnienie można znaleźć w haśle SSIM w Wikipedii.
Dla typowych ustawień jakości SSIM wygląda mniej więcej tak: plik z jakością 85 zwykle uzyskuje wynik powyżej 0,97 i jest wizualnie nieodróżnialny od oryginału; przy 60 wynik spada do 0,90–0,93, obraz jest lekko zmiękczony i widać to dopiero po powiększeniu; przy 40 pozostaje 0,82–0,87, a artefakty są już widoczne gołym okiem.
Te liczby są znacznie uczciwsze niż suwak. Jeśli chcesz ustalać jakość bez zgadywania, możesz użyć polecenia compare w ImageMagicku, aby bezpośrednio obliczyć SSIM dwóch obrazów i znaleźć punkt, w którym „rozmiar jest maksymalnie zmniejszony, ale wynik nie spada poniżej progu percepcji 0,85”. O używaniu tej miary napisałem osobny tekst — szczegółowe omówienie SSIM.
Poniższe małe narzędzie działa w całości w przeglądarce, a obrazy nie są nigdzie wysyłane. Wybierz obraz (albo kliknij „Wypróbuj przykładowy obraz”) i przesuwaj suwak, obserwując rozmiar po kompresji oraz zmiany SSIM. Możesz też automatycznie wyszukać ustawienie o najmniejszym rozmiarze przy SSIM ≥ 0,85. Wartość SSIM jest liczona w czasie rzeczywistym dla świeżo skompresowanego obrazu. To właśnie ta miara z poprzedniej sekcji.
Uwaga: wbudowany w przeglądarkę koder JPEG nie ujawnia parametrów podpróbkowania chrominancji ani tabel kwantyzacji. To narzędzie pokazuje więc rzeczywisty efekt suwaka i kwantyfikuje różnice za pomocą SSIM, a nie pozwala konfigurować wnętrza kodera. I dokładnie to potwierdza tezę tego artykułu: jakość 100 nie jest bezstratna, a ta sama liczba w różnych programach znaczy co innego.
W zdecydowanej większości przypadków około 80 wystarczy, a 100 nie powinno być ustawieniem domyślnym. Plik z jakością 85 jest o 60%–75% mniejszy niż plik z jakością 100, a mimo to gołym okiem nie widać żadnej różnicy; jeśli chcesz bezpiecznie zachować zdjęcia, ustaw 85–92, do stron internetowych i mediów społecznościowych wystarczy 75–82, a poniżej 60 pojawiają się wyraźne artefakty.
Nie. Nawet przy ustawieniu 100 JPEG zwykle najpierw traci około 75% szczegółów koloru w podpróbkowaniu chrominancji, a następnie wskutek kwantyzacji i zaokrąglania powstają nieodwracalne straty. Jeśli chcesz bezstratności, użyj PNG, TIFF lub bezstratnego WebP.
Skala jakości JPEG w Photoshopie to 0–12, a nie 1–100; jego 10 odpowiada mniej więcej wartości 90 w referencyjnej implementacji libjpeg. Różne programy interpretują tę samą liczbę inaczej, więc nie przenoś liczb między programami — kieruj się rzeczywistym rozmiarem wynikowego pliku i wyglądem obrazu.
Najprościej jest powiększyć obraz i porównać go z oryginałem; jeśli chcesz obiektywnego wskaźnika, użyj SSIM. JPEG z jakością 85 ma zwykle SSIM powyżej 0,97 i jest wizualnie nieodróżnialny od oryginału; przy około 40 spada do 0,82–0,87, a artefakty są widoczne gołym okiem. Polecenie compare w ImageMagicku pozwala obliczyć ten wynik bezpośrednio.
Ta liczba na suwaku to parametr dzielenia, a nie procent jakości obrazu; 100 nie jest bezstratne, a poniżej 60 jest przepaść. Jeśli naprawdę chcesz jedną regułę: zdjęcia zapisuj z jakością 85, do publikacji w sieci 80, a 100 nigdzie nie jest potrzebne — plik się podwaja, a jakość nie rośnie ani trochę.
Jeśli chcesz przejść od wyboru formatu i zmiany rozmiaru aż do ustawiania jakości i przyspieszania obrazów w sieci, zajrzyj do kompletnego przewodnika po kompresji obrazów — cały ten łańcuch znajduje się w tamtym tekście.