wartości, odpowiednio, od 0 do 3...

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
Powered by wordpress | Theme: simpletex | © Jak ciÄ™ zĹ‚apiÄ…, to znaczy, ĹĽe oszukiwaĹ‚eĹ›. Jak nie, to znaczy, ĹĽe posĹ‚uĹĽyĹ‚eĹ› siÄ™ odpowiedniÄ… taktykÄ….