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:
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?
Odpowiedzi:
Tak.
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.
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.
Całkowita liczba bitów wynosi 4096 x 24 lub 98304 bitów lub 12288 bajtów.
12288 razy 50 daje 614400 bajtów.
źródło
(display_width * display_height * bpp) / 8
bajty?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 ):
Ten wiersz polecenia ImageMagick
zamieniło to w to:
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:
źródło
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.
źródło
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ę.
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.
źródło