Catedral de la Almudena; Madrid, Espana; Diego Delso, Wikimedia Commons, License CC-BY-SA 4.0

Porównanie jakości plików jpeg zapisywanych przez niektóre programy graficzne dla systemu Android

Catedral de la Almudena; Madrid, Espana; Diego Delso, Wikimedia Commons, License CC-BY-SA 4.0

Catedral de la Almudena; Madrid, Espana; Diego Delso, Wikimedia Commons, License CC-BY-SA 4.0

Od dłuższego czasu przymierzałem się do zbadania nurtującej mnie kwestii jakości plików jpeg, produkowanych przez różne, dostępne dla systemu Android programy graficzne. Z pewnością sami zauważyliście, że to samo zdjęcie zapisane przez rozmaite aplikacje, zajmuje na dysku niejednakową liczbę kilobajtów. Jak wiecie, algorytm kompresji do plików jpeg jest algorytmem stratnym, stąd można natychmiast wyciągnąć wniosek, że im zapisany obrazek „mniej waży”, tym więcej informacji zostało z niego na etapie kompresji bezpowrotnie usuniętych. Taka usunięta informacja objawia się poprzez mniej lub bardziej widoczną utratę jakości zdjęcia.

Obserwowałem kilkakrotnie w internecie dyskusje na temat tego, że któryś z programów „psuje zdjęcie” w większym stopniu niż inne aplikacje. Czy da się w jakiś sposób zbadać, określić liczbowo i porównać jakość plików jpeg wypluwanych przez poszczególne programy graficzne?

Przyjęło się, że stopień kompresji plików jpeg zadaje się pojedynczą liczbą całkowitą, najczęściej z zakresu od 1 do 100. 100 bynajmniej nie oznacza braku kompresji stratnej. Oznacza tyle, że plik uzyskany przy tej wartości jest na ogół najlepszej możliwej jakości, przy założeniu, że stosujemy dany, konkretny algorytm, z danymi, konkretnymi pozostałymi parametrami wejściowymi, od których także zależą efekty kompresji. Żeby było ciekawiej, to za omawianą pojedynczą wartością w rzeczywistości stoją dwie macierze składające się z 64 liczb całkowitych każda. Nazywają się macierzami kwantyzacji i jedna z nich odpowiada za kompresję kanału jasności zdjęcia, a druga kanałów koloru. W dużej części istniejącego oprogramowania, za obsługę formatu jpeg odpowiada kod oparty o bibliotekę programistyczną tworzoną przez Independent JPEG Group (IJG). To właśnie ta organizacja zaproponowała utworzenie skali 1-100 opisującej stopień kompresji, a tym samym jakość pliku wynikowego. Przypisano po prostu sto skrupulatnie wybranych zestawów macierzy (o których była mowa wcześniej) do liczb z zakresu 1-100. Jednakże część producentów oprogramowania stosuje swoje własne macierze i swoje własne skale! Nie jest możliwe poprawne ocenianie różnic w jakości plików jpeg, poprzez porównywanie pojedynczych liczb z różnych skal! Porównywać można, ale całe macierze, a wynik takiego porównania nie przekłada się w trywialny sposób na różnicę w jakości plików.

Oto przykład. Popularny windowsowy program IrfanView obsługuje pliki jpeg wykorzystując bibliotekę dostarczaną przez grupę IJG. Słynny Photoshop nie używa tej biblioteki. Obie aplikacje udostępniają skalę stopnia kompresji w zakresie od 1 do 100 (Photoshop poprzez opcję Save For Web). Wydawałoby się, że jeżeli to samo zdjęcie zapiszemy przy pomocy obu programów z parametrem kompresji 90, to zostanie ono bardzo podobnie skompresowane. Okazuje się jednak, że tak nie jest!

Moim testowym zdjęciem, którym posługiwałem się w moich rozważaniach, została widoczna na początku wpisu fotografia ze zbiorów Wikimedia Commons. Rozmiar zdjęcia wynosi 2048 x 2048 pikseli i jest ono zapisane jako plik jpeg. Po wczytaniu tego pliku do programów IrfanView i Photoshop, dokonałem za pomocą każdego z nich ponownego zapisu przy ustawieniach jakości wynoszących w obu przypadkach 90. W przypadku aplikacji IrfanView wymusiłem także próbkowanie kolorów z pełną rozdzielczością (o tym będzie później…), gdyż w taki właśnie sposób próbkuje kolor Photoshop przy ustawieniach jakości z zakresu 50-100. Okazało się plik zapisany przez Photoshopa ma wielkość 2,40 MB, a zapisany przez IrfanView zaledwie 1,51 MB. Plik przetworzony przez IrfanView został wyraźnie mocnej skompresowany, czyli stracił więcej na jakości (wizualnej)! Stało się tak, gdyż oba omawiane programy stosują różne skale. Inaczej mówiąc, liczbom od 1 do 100 w obu przypadkach zostały przypisane inne zestawy macierzy odpowiedzialnych za stopień kompresji. Ciekawych tematu zachęcam do rzucenia okiem na to porównanie. To jeszcze nie koniec ciekawostek. Co powiecie na to, że IrfanView przy jakości 100 daje z kolei lepszy (mniej skompresowany) plik od tego, który wypluwa z siebie Photoshop w opcji Save For Web i jakości ustawionej także na 100?

Cały ten przydługi wstęp był po to, żeby pokazać, że w przypadku ustawień jakości kompresji plików jpeg w różnych programach graficznych, suwak suwakowi nie jest równy…

Skala liczbowa 1-100 (ani nawet same macierze!) nie mówią także nic o jeszcze jednym aspekcie związanym z kompresją jpeg. Chodzi o tak zwane próbkowanie koloru. Jednym z pierwszych etapów kompresji zdjęcia do pliku jpeg jest rozdzielenie informacji o jasności obrazu od informacji o jego kolorze. Oko człowieka jest bardzo wyczulone na zmianę jasności, a zdecydowanie mniej zauważa drobne różnice koloru. Algorytm może pracować z pełną informacją o kolorze (próbkowanie kolorów z pełną rozdzielczością – najwyższa jakość wynikowego obrazu, ale i największa wielkość pliku), ale może również już na tym etapie bezpowrotnie „gubić” część informacji. Może mianowicie zajmować się kolorem tylko co drugiego rzędu pikseli (oznaczenie: 2 x 1), a nawet tylko co drugiego rzędu i co drugiej kolumny (oznaczenie: 2 x 2). Reszta informacji jest potem na etapie dekompresji (w celu wyświetlenia obrazu) interpolowana, zgodnie z zasadą, że niewielkie przekłamania w barwie nie będą zbyt zauważalne, a zysk w postaci zmniejszenia rozmiaru pliku wynikowego będzie spory.

Programy graficzne dostępne dla systemu Android w zdecydowanej większości nie rozpieszczają użytkowników nadmiarem opcji związanych z zapisem plików jpeg. Najczęściej nie ma się żadnego wpływu na jakość otrzymywanych plików. Czy w takim razie istnieje możliwość przeanalizowania gotowych jpegów i wydobycia z nich interesujących nas danych, dotyczących tego, jak przeprowadzony został proces kompresji?

Na szczęście tak! Moim ulubionym programem służącym do tego celu jest zdecydowanie JPEGsnoop. To darmowa aplikacja dla Windowsa, która po wczytaniu jpega podaje na jego temat całe mnóstwo informacji. Dzięki dawce teorii z początku tego wpisu, każdy może sobie wyłuskać i zinterpretować dane dotyczące jakości kompresji interesujących go jpegów. Czego szukać? Po pierwsze macierzy kwantyzacji (Quantization Table) dla kanałów jasności i kolorów. Pod każdą z nich znajduje się wyliczony współczynnik jakości (Approx quality factor) i to właśnie nim warto posługiwać się przy porównywaniu stopnia kompresji pomiędzy plikami zapisanymi przez różne programy. Poza tym, należy zaglądnąć do sekcji Searching Compression Signatures (w dolnej części wyniku) i odczytać jak był próbkowany kolor (Chroma subsampling). 1 x 1 oznacza, że przy kompresji próbkowano go z pełną rozdzielczością, 2 x 1 to próbkowanie połowy pikseli, a 2 x 2 zaledwie jednej czwartej (co drugi rząd i co drugą kolumnę). Fantastyczną cechą JPEGsnoop jest też to, że aplikacja ta próbuje na podstawie wykrytych cech kompresji zidentyfikować sprzęt i oprogramowanie pasujące do badanego jpega. JPEGsnoop nie zna co prawda programów androidowych, ale większość plików z tych przebadanych przeze mnie identyfikuje jako przetworzone przez edytor oparty o bibliotekę dostarczoną przez IJG (IJG-based editors). W praktyce oznacza to bardzo dużą pewność przy porównywaniu jakości ich kompresji (ten sam algorytm, ta sama skala, żadnych przybliżeń).

Oto programy, którymi się zająłem: Afterlight, Handy Photo, Instagram, Photoshop Express, Photoshop Touch, Snapseed (nowy), VSCO Cam™. Poniżej prezentuję tabelkę z wynikami analizy tworzonych przez nie plików jpeg. Badania dokonałem przy pomocy JPEGsnoop:

Tabela z wynikami

Z tabelki możemy wyczytać kilka ciekawych rzeczy. Jpegi o najwyższej jakości jest w stanie zapisywać Photoshop Touch. Nie dość, że ustawia kompresję na poziomie 100, to w dodatku kolor próbkuje przy pełnej rozdzielczości! Afterlight i Handy Photo także zapisują pliki przy jakości 100, jednakże „oszukują” przy próbkowaniu koloru – zajmują się tylko co drugim rzędem i co drugą kolumną pikseli. Aparat w moim Sony Xperia Z3 Compact dysponuje rozdzielczością 20,7 Mpix, stąd też mnie pozostaje opcja z Handy Photo. Afterlight i Photoshop Touch nie są w stanie zapisywać tak dużych plików… Instagram i Snapseed tworzą jpegi z bardzo podobną kompresją (95), jednakże Instagram bardzo wyraźnie je wyostrza. Oba te programy także stosują próbkowanie typu 2 x 2. Szczerze powiedziawszy jestem trochę rozczarowany tym, czego dowiedziałem się o jpegach produkowanych przez Snapseed… Hmmm. Spośród badanych przeze mnie programów najgorzej wypada Photoshop Express, który (szacunkowo – gdyby traktować go jako program oparty o bibliotekę autorstwa grupy IJG) zapisuje pliki w jakości 90 (chociaż próbkuje kolor w trybie 1 x 1). 90 to jakość jpegów przeglądanych w aplikacji Instagram (i na stronie internetowej Instagramu). VSCO Cam™ zasługuje na kilka słów osobnego komentarza. Generalnie nie jest źle, jakość na poziomie 98 jest w porządku, jednakże mocno intryguje mnie niestandardowy tryb próbkowania kolorów. W trybie 2 x 1 algorytm bierze pod uwagę kolor co drugiego rzędu pikseli. Zastanawiam się, czy ten fakt nie jest przyczyną „pasów”, czy też „siateczki”, o których jest mowa przykładowo w tym wątku na Forum Grupy Mobilnych.

komentarzy 11 dla "Porównanie jakości plików jpeg zapisywanych przez niektóre programy graficzne dla systemu Android"

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

CommentLuv badge