Windows Bitmap
Rozszerzenia pliku |
|
---|---|
Typ MIME |
|
Typ |
BMP – format pliku z grafiką bitmapową. Opracowany pierwotnie dla systemu OS/2, wykorzystywany później także w interfejsach systemów z rodziny Microsoft Windows, jednak jako wolny od patentów jest dostępny i – mimo dużych rozmiarów – popularny jako format przechowywania danych również na wszystkich pozostałych platformach. Zawiera w sobie prostą kompresję bezstratną RLE (która nie musi być użyta), informację o użytych kolorach. Obsługuje tryby RGB oraz RGBA.
Struktura pliku BMP
[edytuj | edytuj kod]Plik BMP składa się z kilku części:
Nazwa struktury | Opcjonalna? | Rozmiar | Przeznaczenie | Komentarz |
---|---|---|---|---|
Nagłówek pliku | Nie | 14 Bajtów | Przechowuje najważniejsze informacje o pliku. | Jest zbędny po załadowaniu obrazka do pamięci. |
Nagłówek DIB | Nie | Różny rozmiar (istnieje 7 różnych wersji tego nagłówka) |
Przechowuje najważniejsze informacje o obrazie i definiuje format piksela. | Występuje bezpośrednio po nagłówku pliku. |
Dodatkowa maska bitowa | Tak | 3 lub 4 DWORD[1] (12 lub 16 bajtów) |
Definiuje format piksela. | Występuje tylko wtedy, gdy nagłówek DIB jest w formacie BITMAPINFOHEADER. |
Tablica kolorów | Zależy od liczby kolorów | Różny rozmiar | Definiuje kolory użyte przez obraz (tablicę pikseli) | Występuje wtedy, gdy głębia kolorów ⩽ 8 |
Gap1 | Tak | Różny rozmiar | Struktura dostosowująca | Artefakty znajdujące się, aż do offsetu pliku dla tablicy pikseli znajdującego się w nagłówku pliku. |
Tablica pikseli | Nie | Różny rozmiar | Definiuje wartości poszczególnych pikseli | Format piksela zdefiniowany jest w nagłówku DIB lub w dodatkowej masce bitowej. Każdy wiersz tablicy pikseli jest wyrównany do wielokrotności 4 bajtów. |
Gap2 | Tak | Różny rozmiar | Struktura dostosowująca | Artefakty znajdujące się, aż do offsetu danych ICC znajdującego się w nagłówku DIB. |
Profil kolorów ICC | Tak | Różny rozmiar | Definiuje profil kolorów dla systemu zarządzania kolorem | Może zawierać ścieżkę do zewnętrznego pliku przechowującego profil kolorów. Po załadowaniu do pamięci jako „nie-spakowany DIB” znajduje się między tablicą kolorów a Gap1[2]. |
Nagłówek pliku
[edytuj | edytuj kod]Ten blok znajduje się na początku pliku i jest używany do jego identyfikacji. Używa się go po to, by sprawdzić, czy jest to plik BMP i czy nie jest on uszkodzony. Pierwszymi dwoma bajtami w formacie BMP są znaki „B”, oraz „M” w kodowaniu ASCII. Wszystkie wartości całkowite są przechowywane w formacie little-endian (tj. najmniej znaczący bajt umieszczony jako pierwszy).
Offset# | Rozmiar | Przeznaczenie |
---|---|---|
0000h | 2 bajty | początek nagłówka używany do identyfikacji pliku BMP, DIB. Najczęściej wynosi 0x42 0x4D w systemie szesnastkowym, odpowiada to znakom BM w kodzie ASCII. Możliwe wartości:
|
0002h | 4 bajty | Oznacza rozmiar całego pliku w bajtach |
0006h | 2 bajty | zarezerwowany; zależy od aplikacji, która tworzy obraz |
0008h | 2 bajty | zarezerwowany; zależy od aplikacji, która tworzy obraz |
000Ah | 4 bajty | Offset, tzn. początkowy adres bitów w tablicy pikseli. |
Nagłówek DIB
[edytuj | edytuj kod]Ta struktura przekazuje aplikacji informacje o obrazie, który będzie wyświetlany. Nagłówek jest dopasowany do wewnętrznych mechanizmów systemów Windows i OS/2 i posiada 7 różnych wariantów. Wszystkie z nich zawierają pole DWORD (32-bitowe), określające rozmiar nagłówka, dzięki niemu można określić typ nagłówka. Duża liczba wersji nagłówka jest spowodowana tym, że Microsoft rozszerzał informacje w nim zawarte kilka razy. Nowe, rozszerzone nagłówki mogą być używane z niektórymi funkcjami GDI i zapewniają większą funkcjonalność. Odkąd GDI wspomaga funkcję ładowania bitmap, większość aplikacji korzysta z tych funkcji. Jedną z konsekwencji jest to, że format odczytywanych plików zależy od wersji systemu, na którym uruchomiona jest aplikacja.
Rozmiar | Nazwa nagłówka | Wspierane systemy operacyjne | Dodane funkcjonalności (rosnąco) | w plikach stworzonych przez program |
---|---|---|---|---|
12 | BITMAPCOREHEADER OS21XBITMAPHEADER |
OS/2 i wszystkie wersje Windows począwszy od Windows 3.0 | ||
64 | BITMAPCOREHEADER2 OS22XBITMAPHEADER |
OS/2 | Dodaje pół-tonowanie. Dodaje kompresje RLE oraz Huffman 1D. | |
40 | BITMAPINFOHEADER | wszystkie wersje Windows począwszy od Windows 3.0 | Likwiduje kompresje RLE-24 oraz Huffman 1D. Dodaje obsługę 16bpp oraz 32bpp pikseli. Dodaje opcjonalną maskę bitów RGB. | Adobe Photoshop |
52 | BITMAPV2INFOHEADER | Brak danych. | Usuwa opcjonalną maskę bitów RGB. Dodaje obowiązkową maskę bitów RGB. | |
56 | BITMAPV3INFOHEADER | Brak danych. | Dodaje obowiązkową maskę bitową dla kanału alfa. | Adobe Photoshop |
108 | BITMAPV4HEADER | wszystkie wersje Windows począwszy od 95/NT4 | Dodaje typ przestrzeni barw oraz korekcje gamma. | |
124 | BITMAPV5HEADER | Windows 98/2000 i nowsze. | Dodaje profile kolorów ICC. |
Nagłówek BITMAPINFOHEADER składa się z 40 bajtów i zbudowany jest w następujący sposób:
Offset względem początku pliku |
Rozmiar w bajtach |
Nazwa | Opis zawartości |
14 | 4 | biSize | Wielkość nagłówka informacyjnego. Długość stąd do końca nagłówka – 40, czasem mniej |
18 | 4 | biWidth | Szerokość obrazu w pikselach |
22 | 4 | biHeight | Wysokość obrazu w pikselach |
26 | 2 | biPlanes | Liczba warstw kolorów, zwykle 1 |
28 | 2 | biBitCount | Liczba bitów na piksel |
30 | 4 | biCompression | Algorytm kompresji |
34 | 4 | biSizeImage | Rozmiar samego rysunku |
38 | 4 | biXPelsPerMeter | Rozdzielczość pozioma |
42 | 4 | biYPelsPerMeter | Rozdzielczość pionowa |
46 | 4 | biClrUsed | Liczba kolorów w palecie |
50 | 1 | biClrImportant | Liczba ważnych kolorów w palecie (gdy 0, to wszystkie są ważne); pole to stosuje się przy animacji bitmap poprzez rotację kolorów. Oznacza, od którego koloru paleta ma być podmieniana. |
51 | 1 | biClrRotation | Flaga sygnalizująca, czy ma następować rotacja palety (domyślnie 0 – brak rotacji). Jeśli flaga jest ustawiona na 1, następuje podmiana palety. |
52 | 2 | biReserved |
Paleta kolorów
[edytuj | edytuj kod]Po części nagłówkowej pliku BMP zazwyczaj znajduje się paleta. Można tu wyodrębnić 2 przypadki:
- W trybach 8-bitowych paleta zbudowana jest z opisów kolorów, gdzie każdy kolor opisany jest za pomocą 4 bajtów (B, G, R, nieużywany lub alpha). Każdą ze składowych koloru należy podzielić przez 4.
- W trybach o większej liczbie kolorów niż 256 paleta nie występuje, a kolor piksela w obrazie zapisywany jest przy pomocy numeru kolejnego koloru, który jest wyliczany ze wzoru:
- Nr Koloru = R + 256 ⋅ G + 65536 ⋅ B,
- gdzie:
- R – wartość składowej czerwonej,
- G – wartość składowej zielonej,
- B – wartość składowej niebieskiej.
Tabela pikseli
[edytuj | edytuj kod]Następnie w pliku znajdują się dane obrazowe.
Linie obrazu zapisywane są od dołu do góry.
W obrazach TrueColor punkty zapisywane są w kolejności B, G, R (trzy bajty), w obrazach o mniejszej liczbie kolorów zapisywane są one na mniejszej ilości bajtów – przykładowo 16-bitowa bitmapa (High Color) zapisuje na dwóch bajtach [5bitów B][6bitów G][5bitów R]. Dla plików z liczbą kolorów mieszczącą się w liczbie ośmiobitowej kolor zapisywany jest jako numer koloru (wskaźnik) w palecie.
Należy zwrócić uwagę, że (poniekąd ze względów historycznych) w wierszu danych pliku BMP jest zawsze zapisana wielokrotność 4 bajtów. Jeśli wiersz danych ma długość (w bajtach) inną niż podzielna przez 4, to dopisuje się bajty o wartości 0, tak aby w danym wierszu ilość bajtów była wielokrotnością 4.
Animowane bitmapy – powstają z cyklicznej podmiany kolorów w palecie, przykładem może być logo startowe systemu Windows. Animowane bitmapy można tworzyć dla obrazów 8-bitowych.
Należy zwrócić szczególną uwagę na zapis kolejnych bajtów danych obrazu: nie jest to [R, G, B], ale [B, G, R].
Zobacz też
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ MSDN - BITMAPINFOHEADER: BI_ALPHABITFIELDS w członie biCompression (ang.)
- ↑ MSDN Typy nagłówków bitmapy (ang.)