Paleta kolorów
Zamiast zapisywać barwę każdego piksela, można zapisać krótką listę barw, paletę, a w pikselach tylko numery pozycji z tej listy. Tak działają GIF i PNG z paletą. Obraz zajmuje mniej miejsca, ale może mieć najwyżej tyle kolorów, ile ma paleta.
Kolor indeksowany
Liczba bitów na piksel wynika z rozmiaru palety: 1 bit to 2 kolory, 4 bity to 16, 8 bitów to 256. W GIF paleta ma zawsze 2, 4, 8, ... 256 pozycji (zob. opis ekranu logicznego), w PNG dowolną liczbę od 1 do 256.
Dobór palety
Zdjęcie ma zwykle dziesiątki tysięcy różnych kolorów. Zamiana go na 256 kolorów to kwantyzacja. Najczęstsze metody:
- paleta stała, np. "web-safe" 6 × 6 × 6 = 216 kolorów o składowych 0, 51, 102, 153, 204, 255. Prosta, ale słaba dla zdjęć.
- median cut (Heckbert, 1982): sześcian RGB z kolorami obrazu dzieli się wielokrotnie na pół wzdłuż najdłuższego boku, aż powstanie 256 pudełek. Kolor z palety to średnia każdego pudełka.
- octree: drzewo podziału sześcianu RGB na ósemki, przycinane od liści, aż zostanie tyle węzłów, ile ma być kolorów.
- k-means: iteracyjne dopasowywanie 256 środków do kolorów obrazu. Najlepsze wyniki, najwolniejsze.
Najbliższy kolor z palety
Gdy paleta jest ustalona, każdy piksel dostaje numer najbliższego koloru. "Najbliższy" najprościej liczyć w RGB, ale lepsze wyniki daje odległość w CIELAB, bo odpowiada temu, co widzi oko. Przykład dla palety web-safe:
Dithering
Gdy kolorów jest za mało, gradienty zamieniają się w pasy. Dithering ukrywa to, mieszając sąsiednie kolory palety w drobny wzór, który oko uśrednia (zob. mieszanie średniujące).
Najpopularniejszy jest dithering Floyda-Steinberga (1976): błąd między kolorem piksela a kolorem z palety rozdziela się na sąsiadów, którzy jeszcze nie zostali przetworzeni:
W naszym przykładzie błąd czerwieni to 200 - 204 = -4, zieleni 80 - 102 = -22, błękitu 40 - 51 = -11. Piksel po prawej dostaje więc (-1,75; -9,6; -4,8), co przesuwa go w stronę ciemniejszego koloru z palety i średnio daje barwę bliższą oryginału.
Alternatywa to dithering uporządkowany z macierzą Bayera: stały wzór progów, szybszy i stabilny w animacjach (nie "migocze" między klatkami), ale z widoczną regularną fakturą.
Błąd przy ditheringu warto liczyć w świetle liniowym, a nie na wartościach z gamma. Inaczej jasne i ciemne obszary wychodzą lekko przesunięte (zob. korekcja gamma).