[Pascal] Funkcja do odczytu pliku BMP


(E Mr Koka) #1

Witam, zabrałem się ot tak sobie do napisania funkcji która będzie rysować podany plik BMP w trybie graficznym. Funkcja napisana, obrazki się pojawiają, niektóre poprawnie a inne są pochylone i z źle pobranymi kolorami.

bmpq.jpg

Jak widać na obrazku, na narysowanej ścianie znajdują się 2 plamy i jedna narysowana została poprawnie a druga jakoś się nie udała. Widać że kolory są nie takie a obrazek został przechylony i dodatkowo widać taką pochyłą linię przez to, że po każdej szerokości obrazka są dodatkowe bajty, nie wiem po co one tam są i to jest powód powstania tego postu.

Podglądałem pliki BMP, które nie dają się narysować i zauważyłem, że offset który wskazuje początek danych obrazowych jest równy 54 zarówno w poprawnie wyświetlającym się pliku jak i w tym "popsutym", jednakże w poprawnie wyświetlającym się pliku BMP po 54 bajcie jest pierwszy bajt pierwszego piksela obrazu (bajt koloru niebieskiego z 3 bajtów piksela BGR), a w plikach wyświetlających się źle po 54 bajcie są jeszcze 2 bajty a dopiero po nich jest ten pierwszy bajt piksela, dodatkowo, jeśli obrazek ma np. 53px szerokości, to co 159 bajtów (53 piksele * 3 bajty BGR na piksel) są dodatkowe bajty jakby kończące wiersz pikseli obrazu. Nie mam pojęcia jaka jest zależność i kiedy tak się dzieje, bo oba nagłówki, zarówno prawidłowo wyświetlającego się pliku jak i tego nie prawidłowo wyświetlającego się pliku są takie same nie licząc rozmiaru pliku i rozmiaru obrazku, brak kompresji czy czegokolwiek takiego.

Czy ktoś zna dokładniejszą, polską specyfikacje plików BMP gdzie opisane by było na czym polega to dopisywanie dodatkowych bajtów? Ponieważ gdybym miał jakąś informacje w nagłówku pliku, że takie coś zaistnieje to potrafił bym wtedy ominąć te 2 bajty z początku każdego wiersza.

Dołączam pełny kod http://wklej.org/id/385067/

Edit:

Dałem rade i zrozumiałem co było napisane na wikipedii, poprzednio liczyłem piksel jako 1 bajt (sic) i dostałem link do wiki anglojęzycznej gdzie były opisane "padding bytes" które są na końcu każdego wiersza i wziąłem na to korektę. Działa. A z tymi dwoma bajtami przed bajtami obrazu to też się walnąłem, niema czegoś takiego.