Windows Bitmap

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Ujednoznacznienie Ten artykuł dotyczy formatu plików graficznych. Zobacz też: Beep Media Player, odtwarzacz muzyki dla Linuksa.
Windows Bitmap
Ikona Windows Bitmap
Ikona
Rozszerzenia pliku .bmp, .dib
Typ MIME image/x-portable-bitmap
image/x-ms-bmp (nieoficjalny)
image/x-bmp (nieoficjalny)
Typ grafika rastrowa

BMPformat 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:
  • BM – Windows 3.1x, 95, NT, ... itd.
  • BA – OS/2 struktura tablicy bitmapy
  • CI – OS/2 struktura kolorowej ikony
  • &CP – OS/2 stały wskaźnik koloru
  • IC – OS/2 struktura ikony
  • *PT – OS/2 wskaźnik
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.

Przykładowy nagłówek w C++

# include <stdint.h>
 
/* Uwaga: Struktura bmpfile_magic została wykluczona z bmpfile_header
          ponieważ powodowała problemy z wyrównaniem bitów.
          Struktura bmpfile_magic powinna zostać odczytana jako pierwsza.
          A struktura bmpfile_header jako kolejna. */
 
struct bmpfile_magic {
  WORD bfType;
};
 
struct bmpfile_header {
  DWORD bfSize;
  WORD bfReserved1;
  WORD bfReserved2;
  DWORD bfOffBits;
};

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. W tabeli poniżej znajdziesz więcej informacji.

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 [6bitów B][5bitó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