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