Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
Pole to służy dwóm celom: dla DIB 4- i &bito-
wych oznacza, że bity pikseli zostały skompresowane przy użyciu typu kodowa- nia grupowego. Dla áIB 16-bitowych i 32-bitowych mówi ono, czy do kodowa- nia bitów pikseli zostało użyte maskowanie kolorów. Ta drtxga funkcja została wprowadzona w Windows 95. Przyjrzyjmy się najplerw kompresji RLE: ů dla DIB 1-bitowycfs pole biCompression wynosi zawsze BI RGB ů dla DIB 4-bitpwych pole biCompression może równać się BI RGB lub BI RLE4 ů dla DIB 8-bitowych pole biCompression może wynosić BI,RGB lub BI RLE8 ů dla DIB 24-bitowych pole biCompression zawsze jest równe BI RGB. jeśli wartość tego pola wynosi BI RGB, bity pikseli zapisywane są tak jak dIa DIB kompatybilnych z OS/2. W pr2eciwnym przypadku bity pikseli podlegaţ kom- presti za poţoeą koţowarlia grupowego. 664 Część II: Grafika Kodowanie grupowe (ang. run-length encoding, RLE) jest jedną z najprostszych form kompresji danych. Wykorzystuje występowanie w wierszach obrazów DIB łańcuchów identycznych pikseli. RLE oszczędza miejsce przez zakodowanie wartości powtarzającego się piksela oraz liczby jego powtórzeń. Schemat RLE używany dla DIB idzie nieco dalej, pozwalając na rozrzedzoną definicję prosto- kątnego obrazu DIB. Oznacza to, że pewne obszary prostokąta pozostają niezde- finiowane. To może zostać wykorzystane przy renderingu obrazów nieprostokąt- nych. Kodowanie grupowe jest pojęciowo prostsze dla DIB 8-bitowych, zatem od nich zacznijmy. Następująca tablica pomoże ci zrozumieć, jak kodowane są bity pik- seli, gdy pole biCompression równe jest BI RGB8. 1 bajt 2 bajty 3 bajty 4 bajty Znaczenie 00 00 Koniec wiersza 00 Ol Koniec obrazu 00 02 dx dy Przejdź do (x+dx, y+dy) 00 n = 03 do FF Użyj następnych n pikseli n = Ol do FF Piksel Powtórz piksel n razy Przy dekodowaniu skompresowanej DIB, patrz na bajty danych DIB parami, tak jak wskazują w tabeli nagłówki "1 bajt" i "2 bajty". Tabela została skonstruowa- na tak, że wartości tych bajtów uszeregowane są rosnąco, jednak więcej sensu ma omawianie jej poczynając od dolnej części. Jeśli pierwszy bajt jest różny od zera (przypadek pokazany w ostatnim wierszu tabeli), wówczas jest to współczynnik powtórzenia grupy. Następująca po nim wartość piksela powtarzana jest tyle razy, na ile wskazuje 1 bajt. Na przykład para bajtów 0x05 0x27 zostanie zdekodowana do ciągu wartości pikseli: 0x27 0x27 0x27 0x27 0x27 Oczywiście DIB będzie zawierała wiele danych, które nie będą powtarzały się od piksela do piksela. To właśnie przypadek odpowiadający drugiemu od dołu wier- szowi tabeli. Określa on liczbę pikseli następujących po sobie, które powinny zostać użyte dosłownie. Rozważ na przykład sekwencję: 0x00 0x06 0x45 0x32 0x77 0x34 0x59 0x90 Po zdekodowaniu otrzymujemy ciąg wartości pikseli: 0x45 0x32 0x77 0x34 0x59 0x90 Te sekwencje są zawsze wyrównywane do 2 bajtów. Jeśli drugi bajt jest nieparzy- sty, wówczas w sekwencji występuje dodatkowy nieużywany bajt, na przykład sekwencja: 0x00 0x05 0x45 0x32 0x77 0x34 0x59 0x00 po zdekodowaniu przybiera postać ciągu wartości pikseli: 0x45 0x32ţ0x77 0x34 0x59 Rozdział 15: Bitmapa niezależna od urządzeń 665 Tak działa kodowanie grupowe. Oczywiście, jeśli w obrazie DIB nie ma powta- rzających się pikseli, wówczas użycie tej techniki kompresji w rzeczywistości zwiększy rozmiar pliku DIB. Pierwsze trzy wiersze przedstawionej wcześniej tabeli pokazują, jak niektóre części prostokątnego obrazu DIB można pozostawić bez ich definiowania. Wyobraź sobie siebie lub program, który napisałeś, przy rozpakowywaniu skompresowanej DIB. Podczas procedury dekompresji będziesz zapamiętywał pary liczb (y, x) poczy- nając od (0, 0). I za każdym razem, gdy rozkodujesz piksel, będziesz zwiększał x 0 1. Po zakończeniu każdego wiersza wyzerujesz x i zwiększysz y o 1. i Gdy napotkasz bajt 0x00, po którym następuje 0x02, odczytasz dwa następne bajty i dodasz je jako przyrosty do aktualnych wartości x i y, po czym możesz konty- nuować dekodowanie. Kiedy odczytasz bajt 0x00, po którym następuje 0x00, skoń- czyłeś wiersz. Nadaj x wartość 0 i zwiększ y. Po napotkaniu bajtu 0x00, a po nim 0x01, skończyłeś rozkodowywanie. Takie kody pozwalają nie definiować niektó- rych obszarów DIB, co przydaje się niekiedy przy kodowaniu nieprostokątnego obrazu lub do wykonywania cyfrowych animacji czy filmów (ponieważ każda g atka głównie zawiera informację z poprzedniej klatki i nie wymaga ponowne- o kodowania). Dla DIB 4-bitowych kodowanie jest generalnie takie samo, chociaż komplikuje się nieco, ponieważ nie ma jednoznacznej odpowiedniości między bajtami a pik- selami. Jeżeli pierwszy bajt, jaki odczytasz, jest niezerowy, to jest to współczynnik po- wtórzenia n. Drugi bajt (który ma być powtórzony) zawiera 2 piksele naprzemien- ne w dekodowanym ciągu n pikseli, na przykład para: 0x07 0x35 dekodowana jest jako: 0x35 0x35 0x35 Ox3? gdzie znak zapytania oznacza, że nie znamy jeszcze wartości piksela. Jeżeli po parze 0x07 0x35 pokazanej powyżej pojawi się para: 0x05 0x24 cała rozkodowywana sekwencja przybiera postać: 0x35 0x35 0x35 0x32 0x42 0x42 Jeśli pierwszy bajt w parze wynosi 0x00, drugi zaś jest równy 0x03 lub więcej, użyj liczby pikseli podanej w drugim bajcie, na przykład, sekwencja: 0x00 0x05 0x23 0x57 0x10 0x00 rozkodowuje się na: 0x23 0x57 Oxl? Zauważ, że zakodowana sekwencja musi zostać dopełniona do parzystej liczby bajtów. Gdy pole biCompression równa się BI RLE4 lub BI RLE8, pole biSizelmage podaje w bajtach rozmiar danych pikseli DIB. Jeżeli pole biCompression wynosi BI RGB, wówczas biSizelmage zwykle ma wartość 0, lecz może być określona jako biHeight razy długość wiersza w bajtach, tak jak zostało to obliczone we wcześniejszej części
|
WÄ…tki
|