FILTRY BARWNE

apewne mia│e╢ kiedy╢ do czynienia z plikami graficznymi (lub masz ci▒gle, je╢li interesuje CiΩ grafika komputerowa). W tym tek╢cie chcia│bym pokazaµ, jakie mo┐liwo╢ci niesie ze sob▒ dostΩp do tzw. palety barw zapisanej w plikach BMP. Ju┐ widzΩ, jak siΩ u╢miechasz, ┐e w og≤le zawracam Ci g│owΩ plikami BMP - tymi potworkami, kt≤re po┐eraj▒ przestrze± dysku bezlito╢nie. Musisz jednak wiedzieµ, ┐e do eksperyment≤w takie pliki s▒ najlepsze. Nie s▒ skompresowane, maj▒ prost▒ strukturΩ, czyta je ka┐dy program graficzny. Dodam, ┐e w tym tek╢cie bΩdzie mowa tylko o plikach 256-kolorowych. S▒ to bowiem pliki, kt≤re w│a╢nie ze wzglΩdu na niewielk▒ liczbΩ kolor≤w skonstruowano technicznie w ten spos≤b, ┐e s▒ one idealnym obiektem do manipulacji na kolorach.

Zaznaczam na samym pocz▒tku, ┐e poni┐szy tekst dotyczy podstawowych zagadnie±, ma za zadanie pom≤c w zrozumieniu pewnych zagadnie± pocz▒tkuj▒cym programistom, kt≤rzy z programowaniem grafiki dotychczas nie mieli nic wsp≤lnego, a prezentowane przeze mnie efekty s▒ banalne.

WiΩc do dzie│a! na pocz▒tek powiem co╢ o plikach BMP. Jak zapewne zauwa┐y│e╢, zajmuj▒ na dysku kupΩ miejsca. Na przyk│ad zdjΩcie w rozdzielczo╢ci 800 na 600 i w 24-bitowym kolorze zajΩ│oby prawie 1,5 MB. To du┐o, ale nie mo┐na oczekiwaµ zbyt wiele po plikach, kt≤re nie s▒ skompresowane. Wszystkie informacje o obrazie s▒ tam zapisywane "na chama", ┐e siΩ tak wyra┐Ω. PozwolΩ sobie przypomnieµ, ┐e nie zawsze w domowym komputerze standardem by│o 20 GB dysku. W zwi▒zku z tym trzeba by│o zrezygnowaµ z jako╢ci na rzecz mniejszej objΩto╢ci plik≤w. Z tego powodu rozpowszechni│y siΩ bitmapy 2, 16 i 256-kolorowe. Te ostatnie s▒ o tyle ciekawe, ┐e ka┐dy piksel jest zapisany jako jeden bajt, co zreszt▒ jest oczywiste, bo 256 kolor≤w = 28. Okazuje siΩ, ┐e je╢li pliki zapisujemy w porz▒dnym programie, to 256 kolor≤w wystarczy aby zapisaµ fotografiΩ, co prawda z do╢µ s│ab▒ jako╢ci▒, ale jednak. Tu jednak trzeba zauwa┐yµ pewn▒ sprawΩ: nie mo┐na by│oby sensownie zapisywaµ takich fotografii, gdyby wszystkie 256 kolor≤w by│y zdefiniowane na sta│e przez wynalazcΩ formatu BMP. We╝my na przyk│ad zdjΩcie z wakacji z pla┐y: zapewne jest tam du┐o odcieni niebieskiego, ale na przyk│ad kolor fioletowy czy seledynowy s▒ rzadsze. Problem ten rozwi▒zano w ciekawy spos≤b. Jak zapewne wiesz, obraz widziany na monitorze sk│ada siΩ z trzech kolor≤w: czerwonego (R-red), zielonego (G-green) i niebieskiego (B-blue). Ka┐dy z tych kolor≤w mo┐e mieµ r≤┐ne nasycenie, co wp│ywa na ostateczny kolor widziany jako mieszanka trzech podstawowych barw. W pliku BMP ka┐dy piksel zapisany jest w jednym bajcie, ale w bajcie tym nie jest zapisane bezpo╢rednio nasycenie barw podstawowych, a jedynie numer koloru. Sk▒d komputer ma wiedzieµ, jaki kolor przyporz▒dkowaµ konkretnemu numerowi? To proste. W pliku BMP 256-kolorowym znajduje siΩ tabelka, w kt≤rej jest zapisane nasycenie ka┐dej z trzech barw podstawowych dla ka┐dego z 256 kolor≤w. Na ka┐dy kolor z 256 przewidziano 4 bajty: w pierwszym jest zapisane natΩ┐enie koloru niebieskiego, w drugim-zielonego a w trzecim-czerwonego. Co z czwartym bajtem? Oficjalnie i grzecznie nazywa siΩ to "polem zarezerwowanym". W rzeczywisto╢ci bajt taki jest ┐eby byµ i zwiΩkszyµ objΩto╢µ pliku. Rzecz w tym, ┐e je╢li mamy wiΩkszy plik, to szybciej zabraknie nam miejsca na dysku i kupimy wiΩkszy. To smutne, ale life if brutal i producenci technologii komputerowych wyci▒gaj▒ Twoj▒ kasΩ z kieszeni tak samo wrednie i nieuczciwie, jak pewna znana Ci zapewne du┐a firma dostarczaj▒ca "za grosze" "doskona│ej" jako╢ci internet w Twoim domu. Wracaj▒c jednak do rzeczy: mimo ┐e bajt zawiera informacjΩ o sk│adowej dla danego koloru, to natΩ┐enie ka┐dej sk│adowej nie mo┐e przyj▒µ 256 warto╢ci, a jedynie 64. Tak wiΩc na przyk│ad natΩ┐enie koloru czerwonego, zielonego czy niebieskiego dla ka┐dego koloru przyjmuje warto╢ci od 0 do 63. Wynika to z koncepcji standardu VGA, gdzie w gniazdku na karcie graficznej ka┐da sk│adowa mo┐e przyj▒µ 64 poziomy napiΩµ. Przy okazji, 64*64*64=262144, tak wiΩc to bzdura, ┐e je╢li ustawisz kolor 24-bitowy, widzisz ponad 16 mln kolor≤w.

Maj▒c ju┐ te informacje w jednym paluszku (musisz je dobrze zrozumieµ) nie powiniene╢ ju┐ mieµ trudno╢ci z wykonaniem programu, kt≤ry przerobi plik zmieniaj▒c natΩ┐enie poszczeg≤lnych barw. Wiem, ┐e byµ mo┐e nie jest to jaka╢ super zabawa, ale - uwierz mi - to najlepszy spos≤b na zrozumienie podstaw palet kolor≤w.

Zapewne chcia│byµ jeszcze wiedzieµ, jak "dobraµ siΩ" do tej palety zapisanej w pliku. Zaczyna siΩ ona od 54 bajtu pliku (czyli offset wzglΩdem pocz▒tku pliku wynosi 54). Pierwsze 54 bajty musisz z pliku wej╢ciowego zapisaµ bez zmian do wynikowego, nastΩpnie czytaµ paletΩ na przyk│ad po 4 bajty, modyfikowaµ odpowiednio i zapisywaµ do pliku wynikowego. W zasadzie modyfikacje te to po prostu zwiΩkszenie/zmniejszenie odpowiednich sk│adowych, co pozwala widzieµ obraz jak przez kolorowe okulary, rozja╢niaµ go lub przyciemniaµ. PamiΩtaj tylko, aby przy pisaniu do pliku wynikowego trzymaµ siΩ przedzia│u [0..63] dla ka┐dej sk│adowej. Przypominam kolejno╢µ kolor≤w: blue, green, red. Zauwa┐, ┐e BGR to zapis odwrotny ni┐ RGB!

Dane znajduj▒ce siΩ za palet▒ wrzucamy oczywi╢cie do pliku wynikowego bez zmian. Je╢li wszystko wykonane zostanie prawid│owo, plik musi byµ poprawnie otwierany przez ka┐dy program graficzny czy przegl▒darkΩ.

Aby zbraµ siΩ do eksperymant≤w, musisz wiedzieµ jeszcze jedn▒ rzecz, kt≤ra niestety skomplikuje Twoje zajΩcie. Ot≤┐ oczywi╢cie ca│y czas operujemy na plikach 256-kolorowych - to w ramach przypomnienia. Okazuje siΩ jednak ┐e plik 256-kolorowy nie musi mieµ 256 kolor≤w. No, mo┐e siΩ ╝le wyrazi│em - nie ka┐dy plik o╢miobitowy ma 256 kolor≤w - tak jest poprawnie. W praktyce tych kolor≤w mo┐e byµ mniej. Ich ilo╢µ jest zapisana w pliku w zmiennej 4-bajtowej o offsecie 46 wzglΩdem pocz▒tku pliku. Odczytaj tΩ liczbΩ i uwzglΩdnij, ┐e paleta nie opisuje 256 kolor≤w, a tyle ile jest zapisane w pliku. W praktyce chodzi o okre╢lenie, ile razy zmieniaµ paletΩ.

»yczΩ Tobie powodzenia w poznawaniu zagadnie± kolor≤w w informatyce. Je╢li bΩdziesz siΩ kiedy╢ zajmowaµ programowaniem grafiki w asemblerze, to wspomnij ten tekst:)


Baner reklamowy: