Zbigniew Szymański  

Struktura pliku *.BMP

 
 WSTĘP

Pliki BMP (ang. Bitmap - mapa bitowa) są plikami graficznymi o bardzo prostej strukturze wykorzystywanymi głównie w systemie Windows. Cechy charakterystyczne tego formatu to:

 STRUKTURA PLIKU BMP

Plik BMP składa się z czterech części:

  1. BITMAPFILEHEADER - nagłówek pliku
  2. BITMAPINFOHEADER - nagłówek mapy bitowej
  3. tablica kolorów składająca się z rekordów RGBQUAD (tylko pliki 1, 4, 8 bitowe)
  4. ciąg bajtów zawierający dane o obrazie
BITMAPFILEHEADER

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
BITMAPINFOHEADER

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.
RGBQUAD

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 OBRAZU

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:

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.

 
TYPY DANYCH
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)
 ŹRÓDŁA

Dane do powyższego opracowania zaczerpnięto z:

  1.  http://web.usxchange.net/elmo/imgcmprs.htm
  2. 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