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ć:
- 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.
źródło
Odpowiedzi:
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):
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.
źródło
Ż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 :
(Jednolicie losowy szum RGB, bezstratny format PNG, 903 kb)
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:(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:(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 .
źródło