Zrozumienie wymagań dotyczących pamięci dla pliku obrazu

9

Chcę zrozumieć wymagania dotyczące pamięci dla plików zasobów obrazu wyświetlanych na ekranie o rozdzielczości 240x400.

Wyświetlacz ma następujące parametry:

okular

Obsługuje do 18 bitów głębi kolorów i wykorzystuje sterownik ekranu ILI9327.

Zakładając, że muszę wyświetlić 50 różnych ikon o wymiarach 10 mm x 10 mm, jakie jest miejsce do przechowywania?

Oto moje obliczenia:

Pikseli na mm = 400 / 61,2 = 6,536

Liczba pikseli na jednym zdjęciu = 65,36 x 65,36 = 4272 pikseli

Każdy piksel będzie wymagał 18 bitów x 3 (dla R, G i B) = 54 bitów

Wymagana liczba bitów = 4272 x 54 = 230688 bitów = 28,16 kilobajtów

Do 50 zdjęć potrzebuję 1.375 megabajtów pamięci.

Czy moje obliczenia są prawidłowe?

Whiskyjack
źródło
2
Obliczasz wymagania dotyczące przechowywania na wyższym poziomie. Zwykle obrazy są kompresowane i często szybszy jest odczyt i dekompresja w locie (np. Z karty SD) niż odczyt dodatkowych bajtów z nieskompresowanego pliku. Dzieje się tak często, ponieważ We / Wy urządzenia stanowią wąskie gardło.
Kingsley

Odpowiedzi:

17

Pikseli na mm = 400 / 61,2 = 6,536

Tak.

Liczba pikseli na jednym zdjęciu = 65,36 x 65,36 = 4272 pikseli

Masz na myśli liczbę pikseli na ikonę. Ale mimo to nie można wytworzyć ułamkowych pikseli, więc liczba powinna wynosić 65 x 65 lub 66 x 66. To prowadzi do dalszego uproszczenia. Dlaczego nie zrobić ikon 64 x 64? Uprości to obliczanie adresu pamięci i spowoduje jedynie „skurczenie” o około 2%. I zaufaj mi, w tym rozmiarze nikt tego nie zauważy. Twoje ikony będą miały rozmiar 4096 pikseli.

Każdy piksel będzie wymagał 18 bitów x 3 (dla R, G i B) = 54 bitów

Nie. Jak właśnie odpowiedział jms, to łącznie 18 bitów na piksel lub 6 bitów na kolor. Ponownie jednak powinieneś rozważyć niepotrzebne martwienie się poziomem bitów. Przechowuj wartości kolorów jako częściowe bajty (6 bitów na bajt) z osobnymi bajtami na kolor. Zajmie to o 33% więcej pamięci, ale drastycznie zmniejszy obciążenie przetwarzania podczas przenoszenia z pamięci na ekran.

Wymagana liczba bitów = 4272 x 54 = 230688 bitów = 28,16 kilobajtów

Całkowita liczba bitów wynosi 4096 x 24 lub 98304 bitów lub 12288 bajtów.

Do 50 zdjęć potrzebuję 1.375 megabajtów pamięci.

12288 razy 50 daje 614400 bajtów.

WhatRoughBeast
źródło
1
Ale z pewnością, jeśli mówimy o trwałym miejscu do przechowywania, to przechowujesz ikony skompresowane jako pliki PNG lub JPEG? A jeśli mówimy o buforze ramki, to po prostu (display_width * display_height * bpp) / 8bajty?
aroth
@aroth - To prosto przenosi cię w sferę kompromisów. Co jest ważniejsze, rozmiar pamięci lub wymagania dotyczące przetwarzania? Przejście na nieskompresowane obrazy pozwala w zasadzie bezbolesne przeniesienie na ekran kosztem dużych plików. Jest to jeszcze łatwiejsze bez potrzeby rozpakowywania danych kolorów z większego słowa. Rozpakowanie skompresowanego obrazu i / lub zastosowanie tabel kolorów pozwala na znacznie mniejsze pliki danych, ale wysiłek przetwarzania może być zastraszający dla początkującego. Wszystko zależy od priorytetów i smaku.
WhatRoughBeast
11

Uprość sobie życie, tworząc ikony 64 × 64 pikseli. Narysuj wokół nich ramkę, jeśli chcesz, aby wyglądały na większe.

W 16-bitowym formacie kolorów wymaga to tylko 8 kB na ikonę lub 400 kB dla zestawu 50.

Jedną z prostych form kompresji jest użycie tabeli kolorów zamiast bezpośredniego przechowywania koloru każdego piksela. 16 kolorów to często więcej niż wystarczająca ilość ikony, zwłaszcza jeśli zastosujesz trochę twórczego roztrząsania. Zmniejsza to pamięć do 2 kB na ikonę oraz 32 bajty dla tabeli kolorów. Całkowita pojemność wynosi nieco ponad 101 kB, jeśli każda ikona ma własną tabelę kolorów.


Aby zaspokoić moją ciekawość, złapałem następujący obraz „najgorszego przypadku” ( stąd ):

siła kolorów

Ten wiersz polecenia ImageMagick

convert image.jpg -crop 267x267+66+0 -resize 64x64 -colors 16 final.png

zamieniło to w to:

wprowadź opis zdjęcia tutaj

Nieźle, i oczywiście obrazy źródłowe z bardziej ograniczoną gamą kolorów wyjdą jeszcze lepiej. Na przykład, oto Olin, przetworzony w ten sam sposób:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Dave Tweed
źródło
2
Słowo kluczowe: kolor indeksowany . Jeśli np. 16 kolorów na bitmapę nie jest wystarczające, możesz podzielić ikonę na kilka mniejszych bitmap, z których każda ma inną paletę. Zastosowanie ditheringu również może pomóc.
jms
9

Więcej informacji o głębi kolorów

Rozwijając odpowiedź Dave'a Tweeda, możesz zrobić nawet lepiej niż to, co pokazał.

Oto ten sam duży oryginał, którego używał:

Przycięty do kwadratu i zmniejszony do 64 x 64 pikseli, ale użycie pełnego koloru (8 bitów na kolor czerwony, zielony, niebieski) daje:

Zaokrąglenie informacji o kolorze z 8 bitów na kanał do 6 bitów powoduje:

To właśnie może zrobić Twój wyświetlacz, ponieważ twierdzisz, że obsługuje 18-bitową głębię kolorów.

Zaokrąglanie informacji o kolorze dalej do 5 bitów dla koloru czerwonego, 6 dla koloru zielonego i 5 dla koloru niebieskiego, co daje w sumie 16 bitów / pikseli:

To naprawdę powinno wystarczyć dla ikon.

Nawet bez kompresji ikony tego formatu zajmują tylko 64 x 64 x 2 = 8192 bajtów. 50 takich obrazów wymagałoby 409 600 bajtów.

Olin Lathrop
źródło
2
Mój obraz jest skompresowany do 4 bitów na piksel (16 kolorów) - 2k bajtów na ikonę plus 32-bajtowa tabela odnośników. Chciałem pokazać, jak wygląda dithering z ograniczonym zestawem kolorów.
Dave Tweed
Ponieważ porównujemy różne głębokości kolorów, czy chcesz dodać jedną z 8-bitową mapą kolorów? To by było w połowie (logarytmicznie) między 4-bitowymi i 16-bitowymi wariantami, które już tutaj mamy.
ilkkachu
@Dave: To nie było jasne z twojej odpowiedzi, ale to wyjaśnia artefakty ditheringu.
Olin Lathrop
8

Każdy piksel będzie wymagał 18 bitów x 3 (dla R, G i B) = 54 bitów

Twoje oszacowanie jest nieprawidłowe. Wartość „18 bitów” odnosi się do piksela , a nie do koloru. Kanały czerwony, zielony i niebieski mają maksymalną głębokość bitów wynoszącą 6 bitów (64 różne wartości), łącznie 18 bitów.
Ten kontroler wyświetlania obsługuje również tryb 16-bitowy (w którym dane pikseli mają tylko 5 bitów dla koloru czerwonego, 6 dla koloru zielonego i 5 dla koloru niebieskiego), co ułatwia spakowanie każdego piksela w zaledwie dwa bajty. Ułatwia to efektywne przechowywanie bitmap i zwiększa liczbę pikseli, które można zapisać na wyświetlaczu na sekundę.

wprowadź opis zdjęcia tutaj

Liczba pikseli na jednym zdjęciu = 65,36 x 65,36 = 4272 pikseli

Nie można praktycznie przechowywać pikseli ułamkowych , więc rzeczywiste mapy bitowe (obrazy / duszki / znaki / cokolwiek) prawdopodobnie miałyby 65 2 = 4225 pikseli.

Idąc prostą drogą (16-bitowy format pikseli R5G6B5), 4225 * 16 bitów to 67600 bitów na bitmapę lub 8450 bajtów na bitmapę. 50 obrazów wymagałoby 423 kB (bez kompresji).

Jeśli naprawdę chcesz uzyskać pełną głębię kolorów, potrzebujesz więcej niż 2 bajty na piksel. Na tym etapie równie dobrze możesz poświęcić jeden bajt na każdy kolor (jak sugeruje WhatRoughBeast), co dodatkowo zwiększy zapotrzebowanie na pamięć o 3/2 (634 kB dla 50 bitmap 65 x 65).

Możesz również spakować 18-bitowe piksele bezpośrednio obok siebie w pamięci (bity subpikseli nieprzyrównane do granic bajtów), bez marnowania żadnych bitów. Potrzebujesz tylko 476 kB dla 50 bitmap 18 x 65 65 x 65, ale programowanie i przetwarzanie wolniej byłoby kłopotliwe.

jms
źródło