Format BMP. BMP jest jednym z formatów plików danych z grafiką
Transkrypt
Format BMP. BMP jest jednym z formatów plików danych z grafiką
IK POP 2016/2017 – projekt 2 - dodatek KSEM WETI PG Format BMP. BMP jest jednym z formatów plików danych z grafiką bitmapową w trybie RGB (Red czerwony, Green – zielony, Blue - niebieski). Struktura pliku BMP jest następująca: Nagłówek pliku (BITMAPFILEHEADER) – 14 bajtów Nagłówek obrazu (BITMAPINFOHEADER) – K bajtów paleta RGB (opcjonalnie) Dane obrazowe – N bajtów ( m wierszy, l kolumn) B G R B G R B ….. G R B G R wiersz m B G R B G R B G R B G R wiersz 1 B G R B G R B G R B G R wiersz 0 Rysunek 1. Sruktura pliku BMP Nagłówek pliku stanowi struktura BITMAPFILEHEADER (Tabela 1), opisującą format pliku. Tabela 1. Budowa nagłówka pliku BMP. Nazwa pola bfType bfSize bfReserved1 bfReserved2 bfOffBits Rozmiar pola (bajty) 2 4 2 2 4 Opis Sygnatura pliku, ‘BM’ dla prawidłowego pliku BMP Długość całego pliku w bajtach Pole zarezerwowane (zwykle zero) Pole zarezerwowane (zwykle zero) Pozycja danych obrazowych w pliku Bezpośrednio po nagłówku pliku następuje nagłówek obrazu. W przypadku formatu zgodnego z rodziną systemów Windows, stanowi go struktura BITMAPINFOHEADER (Tabela 2). Tabela 2. Budowa nagłówka obrazu BMP. Nazwa pola biSize biWidth biHeight biPlanes biBitCount biCompression Rozmiar pola (bajty) 4 4 4 2 2 4 biSizeImage biXpelsPerMeter biYpelsPerMeter biCrlUses biCrlImportant POP_2016_Projekt2_dodatek_IK 4 4 4 4 4 Opis Rozmiar nagłówka informacyjnego Szerokość obrazu w pikselach Wysokość obrazu w pikselach Liczba płatów (musi być 1) Liczba bitów na piksel: 1, 4, 8, 16, 24 lub 32 Algorytm kompresji: BI_RGB=0, BI_RLE8=1, BI_RLE4=2, BI_BITFIELDS=3 Rozmiar rysunku Rozdzielczość pozioma Rozdzielczość pionowa Liczba kolorów w palecie Liczba ważnych kolorów w palecie 1/3 2016-11-27 22:39:00 IK POP 2016/2017 – projekt 2 - dodatek KSEM WETI PG Paleta (tablica) kolorów występuje bezpośrednio po nagłówku BITMAPINFOHEADER, a jej format zależy od typu bitmapy, tj. od liczby bitów przeznaczonych do zakodowania jednego piksela. W trybach o większej liczbie kolorów niż 256, na przykład w trybie 24-bitowym, paleta nie występuje. W języku C++ pola struktur wyrównywane są do 4 bajtów. Oznacza to konieczność odczytywania z pliku dokładnej liczby bajtów dla kolejnych pól struktur BITMAPFILEHEADER i BITMAPINFOHEADER. Podprogram odczytujący nagłówek BITMAPFILEHEADER może wyglądać następująco: Dane obrazu W przypadku braku zdefiniowanej palety kolorów (jak ma to miejsce w obrazach 24-bitowych) bezpośrednio po nagłówku BITMAPINFOHEADER w pliku BMP zapisane są dane obrazu. Kolejne wiersze obrazu zapisane są w odwrotnej kolejności, niż są wyświetlane na obrazie, tj. od dołu do góry (patrzy rysunek 1). W 24-bitowych obrazach punkty zapisywane są w kolejności B (blue), G (green), R (red), przy czym każdy z kolorów reprezentowany jest przez jeden bajt. Rozmiar danych obrazu definiowany jest przez cztery wartości odczytane z nagłówków BMP: wartość bfSize i bfOffBits z nagłówka BITMAPFILEHEADER oraz biHeight i biWidth z nagłówka BITMAPINFOHEADER. Podczas gdy biHeight i biWidth definiują liczbę pikseli w wierszach i kolumnach obrazu, różnica (bfSize-bfOffBits) określa rzeczywistą liczbę bajtów danych obrazu. Liczba ta może być większa, niż wynika to wartości biHeight i biWidth. − ≥ 3∙ ℎ∙ ℎ dla obrazu 24-bitowego ( 3 bajty na piksel). Dodatkowe bajty to bajty „zerowe”, które mogą znaleźć się na końcu każdego wiersza (wynika to z wyrównywania liczby bajtów w każdym wierszu danych BMP do wielokrotności liczby 4). Przykład Dany jest obraz o wymiarach: bfSize = 60, biWidth = 3 i biHeight = 5. Rysunek 2 przedstawia strukturę takiego obrazu. Wysokość obrazu to 5 wierszy, szerokość – 3 kolumny pikseli. Każdy piksel zapisany jest na trzech bajtach, a więc potrzeba 9 bajtów do przechowania informacji o każdym z wierszy obrazka. Okazuje się, że wiersze w pliku są dłuższe o kolejne 3 bajty zerowe w celu wyrównania ich długości (liczonej w bajtach) do wielokrotności liczby 4. Dane obrazu zajmują więc 60 bajtów, mimo że mogłyby się zmieścić w 45 bajtach. POP_2016_Projekt2_dodatek_IK 2/3 2016-11-27 22:39:00 IK POP 2016/2017 – projekt 2 - dodatek KSEM WETI PG b0 g0 r0 b1 g1 r1 b2 g2 r2 0 0 0 b3 g3 r3 b4 g4 r4 b5 g5 r5 0 0 0 b6 g6 r6 b7 g7 r7 b8 g8 r8 0 0 0 b9 g9 r9 b10 g10 r10 b11 g11 r11 0 0 0 b12 g12 r12 b13 g13 r13 b14 g14 r14 0 0 0 wysokość obrazu: 5 szerokość obrazu: 3 liczba bajtów w wierszu: 12 (szerokość obrazu * 3 + 3) liczba bajtów obrazu = 60 ( liczba bajtów w wierszu * wysokość obrazu ) Rys. 2. Przykładowa struktura danych obrazu w pliku BMP. Wszystkie pliki BMP przetwarzane w ramach projektu POP to bitmapy 24-bitowe. Większość metod cyfrowej obróbki obrazów należy zastosować niezależnie dla każdej składowej RGB. Przetworzone dane należy zapisać w nowym pliku BMP, kopiując nagłówki z plików oryginalnych (nieprzetworzonych) oraz uzupełniając kolejne wiersze danych w pliku o dodatkowe, zerowe bajty. Literatura: 1. 2. 3. 4. http://aragorn.pb.bialystok.pl/~boldak/ http://pl.wikipedia.org/wiki/Windows_Bitmap http://pl.wikipedia.org/wiki/Wyr%C3%B3wnanie_histogramu D. Phillips; Image Processing in C: Analyzing and Enhancing Digital Images, RandD Publications, 1994, http://homepages.inf.ed.ac.uk/rbf/BOOKS/PHILLIPS/cips2ed.pdf 5. http://kgrudzi.iis.p.lodz.pl/PP/obraz/zad1/BMP_opis_2.pdf 6. http://www.januszg.hg.pl/teksty/budowa_pliku_bmp.html POP_2016_Projekt2_dodatek_IK 3/3 2016-11-27 22:39:00