Zbigniew Szymański |
|
Struktura pliku *.BMP
|
|
Pliki BMP (ang. Bitmap - mapa bitowa) są plikami graficznymi o bardzo
prostej strukturze wykorzystywanymi głównie w systemie Windows. Cechy charakterystyczne
tego formatu to:
-
Długość każdej linii obrazu jest wyrównywana do pełnych 4 bajtów.
-
Linie obrazu są zapisywane w pliku w kolejności dół -> góra.
-
Liczba bitów na piksel może wynosić: 1, 4, 8, 24.
-
Wartości kolejnych składowych R (czerwony) G (zielony) B (niebieski) są
umieszczone w pliku w kolejności BGR.
-
Pliki 1, 4 i 8 bitowe posiadają mapę kolorów. Każdy element mapy kolorów
przechowuje informację o składowych RGB koloru o danym indeksie oraz
zawiera jeden niewykorzystany bajt.
-
plik 8-bitowy zawiera mapę kolorów o maksymalnej liczbie elementów 256,
zaś każdy bajt obrazu jest indeksem do elementu mapy
-
plik 4-bitowy zawiera mapę kolorów o maksymalnej liczbie elementów 16,
zaś każdy bajt obrazu zawiera dwa indeksy do elementów mapy. Bardziej znacząca
część bajtu odpowiada pierwszemu pikselowi, mniej znacząca drugiemu.
-
plik 1-bitowy zawiera 2 elementową mapę kolorów, zaś każdy bajt obrazu
zawiera osiem indeksów do elementów mapy.
-
plik 24-bitowy nie posiada mapy kolorów. Każde kolejne 3 bajty obrazu reprezentują
jeden piksel.
-
pliki BMP mogą zostać skompresowane za pomocą algorytmu RLE (Run Length
Encoded). Dane o obrazie zapisywane są wówczas w następującym formacie:
N index N index .... , gdzie N jest liczbą kolejnych pikseli o kolorze
określonym przez element mapy kolorów o numerze index.
Plik BMP składa się z czterech części:
-
BITMAPFILEHEADER - nagłówek pliku
-
BITMAPINFOHEADER - nagłówek mapy bitowej
-
tablica kolorów składająca się z rekordów RGBQUAD
(tylko pliki 1, 4, 8 bitowe)
-
ciąg bajtów zawierający dane o obrazie
type
BITMAPFILEHEADER=record
bfType : WORD;
bfSize : DWORD;
bfReserved1 : WORD;
bfReserved2 : WORD;
bfOffBits : DWORD;
end;
bfType |
Dwa bajty zawierające znaki 'BM' oznaczające, że jest to plik
BMP. |
bfSize |
Całkowity rozmiar pliku wyrażony w bajtach. |
bfReserved1 |
Zarezerwowane, wymagana wartość zero. |
bfReserved2 |
Zarezerwowane, wymagana wartość zero. |
bfOffBits |
Przesunięcie (wyrażone w bajtach) danych obrazu (mapy bitowej) od rekordu
BITMAPFILEHEADER |
const
BI_RGB=0;
BI_RLE8=1;
BI_RLE4=2;
type
BITMAPINFOHEADER=record
biSize : DWORD;
biWidth : LONG;
biHeight : LONG;
biPlanes : WORD;
biBitCount : WORD;
biCompression : DWORD;
biSizeImage : DWORD;
biXPelsPerMeter : LONG;
biYPelsPerMeter : LONG;
biClrUsed : DWORD;
biClrImportant : DWORD;
end;
biSize |
Rozmiar rekordu BITMAPINFOHEADER wyrażony w bajtach (powinien być zawsze
40). |
biWidth |
Szerokość obrazu w pikselach |
biHeight |
Wysokość obrazu w pikselach |
biPlanes |
Przyjmuje zawsze wartość 1. |
biBitCount |
Liczba bitów na piksel (1, 4, 8, 24) |
biCompression |
Typ kompresji obrazu:
-
BI_RGB - brak kompresji
-
BI_RLE8 - kompresja RLE plików 8 bitowych
-
BI_RLE4 - kompresja RLE plików 4 bitowych
|
biSizeImage |
Rozmiar mapy bitowej obrazu wyrażony w bajtach. Może być ustawiony
na zero, jeśli typem kompresji jest BI_RGB. |
biXPelsPerMeter |
Rozdzielczość pozioma obrazu wyrażona w pikselach na metr - można zignorować
(ustawić na 0) |
biXPelsPerMeter |
Rozdzielczość pionowa obrazu wyrażona w pikselach na metr - można zignorować
(ustawić na 0) |
biClrUsed |
Liczba elementów tablicy kolorów. Wartość zero oznacza maksymalną dopuszczalną
liczbę kolorów. |
biClrImportant |
Liczba indeksów (kolorów) w tablicy kolorów, które są wymagane do poprawnego
wyświetlenia obrazu. Wartość zero oznacza, że wszystkie kolory są wymagane. |
type
BITMAPINFOHEADER=record
rgbBlue : BYTE;
rgbGreen : BYTE;
rgbRed : BYTE;
rgbReserved : BYTE;
end;
rgbBlue |
Wartość składowej niebieskiej koloru (0-255) |
rgbGreen |
Wartość składowej zielonej koloru (0-255) |
rgbRed |
Wartość składowej czerwonej koloru (0-255) |
rgbReserved |
Zarezerwowane (0) |
Dane o obrazie składają się z ciągu bajtów. Liczba bitów na piksel i
kompresja jest określona przez zmienne biBitCount & biCompression.
KOMPRESJA RLE8
Wartość BI_RLE8 zmiennej biCompression oznacza, że obraz (8 bitów na
piksel) jest skompresowany algorytmem Run Length Encoding. Występują dwa
tryby:
-
encoded - dane o obrazie są zakodowane w grupach składających się z dwóch
bajtów. Pierwszy z bajtów jest różny od zera lub jeśli jest równy zero
drugi bajt ma wartość 0, 1 lub 2.
-
absolute - pierwszy bajt jest równy 0, drugi bajt ma wartość większą od
2
Pierwszy bajt |
Drugi bajt |
Kolejne bajty |
Wartość różna od zera - liczba kolejnych wystąpień piksela o kolorze
określonym przez drugi bajt. |
Indeks koloru powtarzanego piksela |
- |
0 |
0 - koniec linii |
- |
0 |
1 - koniec mapy bitowej |
- |
0 |
2 - delta |
Kolejne dwa bajty określają położenie kolejnego piksela względem bieżącego
(przesunięcie poziome i pionowe - liczby bez znaku). |
0 |
wartość większa od 2 - liczba bajtów następujących po danym bajcie,
z których każdy zawiera kolor pojedynczego piksela |
Kolejne bajty zawierają indeksy do kolorów pojedynczych pikseli. |
WORD |
16 bitowa liczba całkowita bez znaku |
DWORD |
32 bitowa liczba całkowita bez znaku |
LONG |
32 bitowa liczba całkowita ze znakiem |
BYTE |
bajt (8 bitów) |
|
|
Dane do powyższego opracowania zaczerpnięto z:
-
http://web.usxchange.net/elmo/imgcmprs.htm
-
MSDN Library - July 1999
Data ostatniej aktualizacji: 21.04.2001
Pocztę o dostrzeżonych błędach proszę kierować na adres:Z.Szymanski@elka.pw.edu.pl