Żeby to sprawdzić, pozwól mi eksperymentalnie przetestować analizę ForeverWintr .
Najgorszym rodzajem obrazu wejściowego do kompresji JPEG (lub jakiejkolwiek innej kompresji) są jednakowo losowe szumy RGB, które teoretycznie są nieściśliwe. Pozwól, że wygeneruję trochę za pomocą narzędzi netpbm :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(Jednolicie losowy szum RGB, bezstratny format PNG, 903 kb)
Uwaga (marzec 2017 r.): Jestem prawie pewien, że powyższy obraz był w formacie PNG, kiedy po raz pierwszy napisałem tę odpowiedź i przesłałem ją w 2013 r. (Poniżej znajduje się nawet komentarz na temat zarządzania kolorami.) Wygląda na to, że w pewnym momencie został po cichu przekonwertowany na JPEG, dzięki czemu porównanie wizualne tutaj jest bezużyteczne.
Próbowałem ponownie załadować nowy obraz testowy PNG, ale najwyraźniej uderza on w pewnego rodzaju limit rozmiaru pliku PNG w imgur i zostaje automatycznie przekonwertowany na JPEG. Nie jestem pewien, czy można rozwiązać ten problem, ale przynajmniej jeśli masz dostęp do Linux-a, zawsze możesz ponownie uruchomić podane polecenia, aby wygenerować własne obrazy testowe. W każdym razie, poza uniemożliwieniem bezpośredniego wizualnego porównania jakości kompresji, nie unieważnia to w żaden sposób poniższej analizy.
OK, więc nieskompresowany plik PPM ma 640 × 480 × 3 = 921,600 bajtów plus 15 bajtów dla minimalnego nagłówka PPM, zgodnie z oczekiwaniami. Próba bezstratnej kompresji przy użyciu formatu PNG kończy się zwiększeniem rozmiaru o 2157 bajtów, prawdopodobnie zajętym przez nagłówki i metadane PNG oraz być może niewielką nieefektywnością algorytmu kompresji próbującego kompresować dane nieściśliwe.
(Tak, to 3 bajty na piksel, a nie 4; nawet format PPM, który jest tak prosty, jak tylko można uzyskać format pliku graficznego, nie jest wystarczająco głupi, aby przechowywać bezużyteczny czwarty bajt na piksel na dysku. Może być trochę korzyść z robienia tego w pamięci ze względu na wyrównanie, szczególnie jeśli musisz również zapisać kanał alfa, ale te powody nie mają zastosowania podczas zapisywania obrazu do pliku).
OK, a co z JPEG? Spróbujmy najpierw zminimalizować straty kompresji (jakość = 100, brak podpróbkowania barwy, zmiennoprzecinkowy DCT). Niestety, pnmtojpeg
instrukcja nie wyjaśnia jasno, jak ustawić wszystkie odpowiednie opcje (konkretnie, -sample
opcja ta jest wymieniona w sekcji „Opcje dla kreatorów”, która po prostu odwołuje się do pliku w dokumentacji libjpeg), więc przekonwertuję go w zamiast tego GIMP. Plik wynikowy wygląda następująco:
897249 rnd.jpg
(Szum RGB skompresowany JPEG, jakość = 100, brak podpróbkowania barwy, 876 kb)
Co może być mniejsze? Czy nie powiedziałem tylko, że czysty hałas jest nieściśliwy? Chodzi o to, że nawet przy maksymalnej jakości normalna kompresja JPEG nie jest dość bezstratna. Ponownie otwierając obraz w GIMP i porównując go z oryginałem, widać, że niektóre piksele miały przesunięte wartości kolorów o jeden lub dwa kroki (spośród 256). Są to piksele, w których algorytm kompresji JPEG „oszukał” i wyrzucił trochę tutaj, inny tam, gdzie oszacowano, że zmiana nie będzie zauważalna. Rzeczywiście, dla nieuzbrojonego ludzkiego oka wynik jest całkiem nie do odróżnienia od oryginału, ale te odrzucone bity sumują się do mierzalnego zmniejszenia rozmiaru pliku, nawet po uwzględnieniu nagłówka i narzutu kodowania.
To była maksymalna jakość; co z bardziej typowymi ustawieniami, takimi jak pnmtojpeg
ustawienia domyślne (jakość = 75, włączone podpróbkowanie)? Spróbujmy:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(Szum RGB skompresowany JPEG, jakość = 75, podpróbkowanie kolorów, 184 kb)
Wow, od 901 do 184 kb! Jest to jednak dość agresywna kompresja i zdecydowanie możesz odróżnić, porównując zdjęcia. Większość z nich wynika z podpróbkowania barwy, która w zasadzie wyrzuca 75% danych koloru (barwy / nasycenia). Wypróbowanie go w GIMP z wyłączonym podpróbkowaniem daje plik 350 618 bajtów, który nadal wygląda (przynajmniej dla ludzkiego oka) całkiem blisko oryginału, nawet po powiększeniu.
W każdym razie chodzi o to, aby pokazać, że bez względu na to, jak głośne mogą być twoje zdjęcia na nocnym niebie, i bez względu na to, jak wysoką jakość możesz wybrać, po prostu nie ma możliwości, aby plik JPEG 640 × 480 mógł być znacznie większy niż 900 kb. (Cóż, chyba że twój aparat podłącza do niego wielobajtowy profil kolorów Exif lub coś równie głupiego). A jeśli używasz bardziej typowych ustawień kompresji JPEG, maksymalny możliwy rozmiar pliku spada do około 200 kb lub mniej więcej .