Jaki jest największy rozmiar pliku JPEG 640x480?

25

Tworzę urządzenie do przechowywania danych, które wykonuje kilka zdjęć nocnego nieba w ciągu kilku godzin, a zdjęcia zostaną pobrane zaraz po ich zrobieniu. Karta pamięci musi umożliwiać zapisanie wszystkich zdjęć jednocześnie.

Pliki JPEG, które zostaną wykonane, mają rozdzielczość 640 x 480 pikseli i konieczne jest, aby na karcie pamięci było wystarczająco dużo miejsca dla wszystkich 100 z nich. Więc jaki jest największy rozmiar pliku JPEG 640x480?

Zrobiłem kilka zdjęć testowych, aby to zrozumieć:

# 1# 2# 3

  • Rozmiar pliku obrazu „stackoverflow” wynosi 73 774 bajtów.
  • Rozmiar białego obrazu wynosi tylko 36 607 bajtów.
  • Ale rozmiar pliku dla zdjęć w szachownicę wynosi 149 339 bajtów.

Zakładam, że rozmiar pliku rośnie ze złożonością.

Jak mogę zbudować wystarczającą ilość miejsca na karcie pamięci, aby zmieścić 100 640x480 JPEG, nie wiedząc, jak skomplikowane i jaki będą rozmiar? Nie chcę marnować dodatkowej przestrzeni, ponieważ być może produkuję wiele z tych urządzeń do przechwytywania.

Niebieski lód
źródło
zależy to od producenta obrazu. Plik JPEG o jakości 100 można łatwo powiększyć. Jakie są ustawienia twojego aparatu i aparatu?
John Dvorak,
Aparat testowy to Canon Powershot A1100 IS. Aby uzyskać więcej informacji, możesz sprawdzić metadane, ponieważ nie jestem pewien, o co prosisz.
Blue Ice
1
Zrobiłeś jakieś przykładowe zdjęcia nocnego nieba na dif. Ustawienia Q? Jako test?
Carl B,
2
Co to jest za ? Czy jesteś pewien, że JPEG to właściwy wybór formatu.
Jack Aidley,
3
Dodanie tła do komentarza Jacka Aidleysa: Kompresja JPEG zmienia obraz. Dokonuje założeń i odrzuca informacje, aby uzyskać mniejszy rozmiar pliku. (O ile nie ustawiono na 100% jakości, w takim przypadku możesz równie dobrze użyć formatu nieskompresowanego. Często aparat cyfrowy ma ustawienie tiff lub nawet surowe ustawienie. Jeśli chcesz zachować wszystkie małe kropki, takie jak gwiazdy, użyj jednej z te). Dzięki temu rozmiar obrazu będzie całkowicie przewidywalny.
Hennes,

Odpowiedzi:

22

Tutaj sugeruję górną granicę dla rozmiarów plików JPEG. Zobacz odpowiedź Ilmari Karonena na omówienie bardziej typowych rozmiarów JPEG.

Miejsce do przechowywania pikseli dla 32-bitowego obrazu bitmapowego 640X480 można w ten sposób obliczyć (na podstawie tej odpowiedzi, ale poprawione na podstawie komentarza Ignacio Vazquez-Abramsa i tej odpowiedzi):

Zakładając, że do pliku nie zastosowano kompresji, istnieje 307 200 pikseli, co stanowi 0,3 MP. Poręczny stół do wyszukiwania

Jeśli każdy piksel zawiera 32 bity informacji, to

  1. 307,200 * 32 = 9 830 400 bitów informacji
  2. Podziel przez 8 bitów, aby uzyskać wartość bajtu
  3. 9 830 400/8 = 1228800 bajtów (lub 1,17 Mb)

Jest to rozmiar nieskompresowanej mapy bitowej i jako taka powinna być górną granicą rozmiaru pliku jpeg (w rzeczywistości, ponieważ format JPEG wykorzystuje kompresję , twoje zdjęcia powinny być znacznie mniejsze, szczególnie biorąc pod uwagę, że robisz zdjęcia w nocy niebo, które, jak sądzę, zawiera dużo czerni. Zauważ, że największy przykładowy obraz w twoim pytaniu ma tylko 0,14 MB).

Jednak w odniesieniu do konkretnego problemu, nawet przy użyciu tej górnej granicy, 100 obrazów to tylko 117 MB, a od dawna nie widziałem karty pamięci tak małej jak 128 MB. Podejrzewam, że każda obecnie dostępna karta pamięci będzie miała wystarczającą pojemność, aby zaspokoić twoje potrzeby.

Najwyraźniej kwestia maksymalnego rozmiaru pliku JPEG podlega dyskusji. Ta odpowiedź przepełnienia stosu sugeruje teoretyczny maksymalny rozmiar 20,25 bajtów na piksel lub 5,9 MB w twoim przypadku, ale utworzenie obrazu o tym rozmiarze wymaga celowego niewłaściwego użycia schematu kompresji formatu jpeg, więc jest bardzo mało prawdopodobne, abyś kiedykolwiek widział taki rzecz wyprodukowana przez aparat.

ForeverWintr
źródło
1
Niestety, nawet nieskompresowana wartość bitmapy jest tylko trochę niska, ponieważ zakłada pakowanie. Rozpakowana mapa bitowa używa 32 bitów na piksel (ze względu na wyrównanie ), zwiększając rozmiar pliku o 33%.
Ignacio Vazquez-Abrams
Dzięki @ IgnacioVazquez-Abrams. To, co otrzymuję za założenie, że zaakceptowana odpowiedź jest poprawna.
ForeverWintr
1
@ IgnacioVazquez-Abrams - „Wyrównanie” jest atrybutem podyktowanym przez procesor (nie nośnik pamięci) i jest wygodne, gdy dane znajdują się w pamięci RAM do przetworzenia. Do celów przechowywania 32-bitowe wyrównanie słów nie jest koniecznością, a na pewno ekstrawagancją. Pakowanie danych jest częstą operacją przed zapisaniem do pamięci, szczególnie w przypadku oszczędności o 25%. Widziałem aparaty cyfrowe, które przechowują każdy piksel dokładnie w 3 bajtach dla surowego formatu.
trociny
1
„... z pewnością ekstrawagancja.” Dzisiaj. Wiele księżyców temu było kiedyś uważane za funkcję oszczędzającą cykl (nie trzeba wyrównywać obciążenia, biorąc pod uwagę, ile to zajmie).
Ignacio Vazquez-Abrams,
3
W praktyce, podczas gdy niektóre systemy mogą przechowywać dane obrazu RGB jako 4 bajty na piksel w pamięci , prawie wszystkie formaty plików obrazów wykorzystują maksymalnie 3 bajty na piksel (chyba że w czwartym bajcie jest zapisany rzeczywisty kanał alfa). Zobacz moją odpowiedź poniżej.
Ilmari Karonen,
35

Ż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
(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, pnmtojpeginstrukcja nie wyjaśnia jasno, jak ustawić wszystkie odpowiednie opcje (konkretnie, -sampleopcja 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

Kompresowany JPEG szum RGB, jakość = 100, brak podpróbkowania barwy
(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 pnmtojpegustawienia domyślne (jakość = 75, włączone podpróbkowanie)? Spróbujmy:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg

Kompresowany JPEG szum RGB, jakość = 75, podpróbkowanie kolorów
(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 .

Ilmari Karonen
źródło
4
teoretycznie nieściśliwy tylko dla bezstratnej kompresji, prawda?
Daniel Beck
1
@DanielBeck: Racja. Oczywiście możesz dowolnie kompresować dowolne dane, jeśli chcesz po prostu wyrzucić ich części. (Zasadniczo działa kompresja JPEG, po prostu próbuje to zrobić w taki sposób, aby zagubione części nie były zauważalne dla ludzkiego oka, a to, co pozostało, można zakodować w zwarty sposób. Hałas jest nadal trudny, ponieważ tylko rzeczą nawet algorytm kompresji stratnej może zrobić z hałasem jest wyrzucić jego części).
Ilmari Karonen
Może to tylko ja, ale drugi obraz wygląda jaśniej niż pierwszy.
Bogdacutu,
@Bogdacutu: Nie powinno, chociaż zawsze jest możliwe, że twoja przeglądarka robi coś dziwnego z zarządzaniem kolorami itp. Spróbuj załadować je zarówno w edytorze graficznym, jak i porównać wartości kolorów.
Ilmari Karonen,
Niezły napis @Ilmari.
ForeverWintr