BMP圖像文件是Windows 3.X
所採用的圖像文件格式,幾乎所有Windows
上的應用軟件都支持這種圖像文件,其中最常見的就是Windows本身所附的繪圖軟件(Paint-Brush),所以欲在Windows上探討圖像的文件格式,勢必要對BMP有一個完整而全面的認識。
BMP圖像分爲兩類,DDB和DIB,DDB(device-dependent
bitmap)即爲設備相關位圖,DIB(device-independent bitmap)即爲設備無關位圖。
DDB中不包括顏色信息,顯示時是系統的調色板爲基礎進行各位的顏色映射的,Windows只能保證系統調色板的前20種顏色穩定不變,所以DDB只能保證正確顯示色彩少於20色的位圖,這便是侷限性。所以現在研究的基本上都是基於DIB的圖像文件。
DIB(設備無關位圖)可以在不同的機器或系統中顯示位圖所固有的顏色。與DDB相比而言,DIB是一種外部的位圖格式,經常存儲以BMP爲後綴的位圖文件。DIB位圖還支持圖像數據的壓縮。BMP文件由文件頭、位圖信息頭、顏色信息和圖像數據四部分組成。位圖結構如圖3-1所示:
位圖文件頭結構BITMAPFILEHEADER
位圖信息頭結構BITMAPINFOHEADER
位圖調色板RGBQUAD
位圖像素數據
圖3-1
DIB位圖結構
1.
BMP文件頭:
BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。其結構定義如下:
typedef
struct tagBITMAPFILEHEADER
{
WORD
bfType;
WORD
bfSize;
WORD
bfReserved1;
WORD
bfReserved2;
WORD
bfOffBits;
}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;
該結構的長度是固定的,爲14個字節,各個域的說明如下:

bfType:指定文件類型,必須是0x4d42,即字符串“BM”。

bfSize:指定文件大小,包括這14個字節。

bfReserved1,bfReserved2:保留字,爲0。

bfOffBits:從文件頭到實際的位圖數據的偏移字節數,即圖1中前三個部分的長度之和。
2.
位圖信息頭:
BMP位圖信息頭數據用於說明位圖的尺寸等信息。
typedef
struct tagBITMAPINFOHEADER
{
DWORD
biSize;
LONG
biWidth;
LONG
biHeight;
WORD
biPlanes;
WORD
biBitCount;
DWORD
biCompression;
DWORD
biSizeImage;
LONG
biXPelsPerMeter;
LONG
biYPelsPerMeter;
DWORD
biClrUsed;
DWORD
biClrImportant;
}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
該結構的長度也是固定的,爲40個字節,各個域的說明如下:

biSize:指定這個結構的長度,爲40個字節。

biWidth:指定圖像的寬度,單位是象素。

biHeight:指定圖像的高度,單位是象素。

biPlanes:必須是1。

biBitCount:指定表示顏色時用到的位數,常用的值爲1(黑白二色圖)、4(16色圖)、8(256色圖)、24(真彩色圖)。

biCompression:指定位圖是否壓縮,有效值爲BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位圖可採用RLE4和RLE8的壓縮格式,BI_RGB表示不壓縮。

biSizeImage:指定實際的位圖數據佔用的字節數,可用以下的公式計算出來:
biSizeImage
= biWidth’×
biHeight
要注意的是:上述公式中的biWidth’必須是4的整數倍(不是biWidth,而是大於或等於biWidth的離4最近的整數倍)。如果biCompression爲BI_RGB,則該項可能爲0。

biXPelsPerMeter:指定目標設備的水平分辨率。

biYPelsPerMeter:指定目標設備的垂直分辨率。

biClrUsed:指定本圖像實際用到的顏色數,如果該值爲0,則用到的顏色數爲2的biBitCount次冪。

biClrImportant:指定本圖像中重要的顏色數,如果該值爲0,則認爲所有的顏色數都是重要的。
3.
圖調色板(RGBQUAD):
第三部分爲調色板。有些位圖需要調色板,有些位圖,如真彩色圖,不需要調色板,它們的BITMAPINFOHEADER後面直接是位圖數據。
調色板實際上是一個數組,共有biClrUsed個元素(如果該值爲0,則有2的biBitCount次冪個元素)。數組中每個元素的類型是一個RGBQUAD結構,佔4個字節,其數據結構定義如下:
typedef
struct tagRGBQUAD
{
BYTE
rgbBlue;
DDB和DIB 是什麼?區別?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
2020.2最新Win10x64+Eclipse/VSCODE+ESP8266_RTOS_SDK3.0開發環境搭建指導
IOT砖家
2020-06-29 01:39:12
把一個廢柴插座轉眼變身遠程控制智能插座-Arduino-MQTT-Onenet-8266
IOT砖家
2020-06-29 01:39:02
自定義方波波形發生器(代碼庫)
蓝忧云枫
2020-06-07 01:02:12
WeMos TTGO WiFi + 藍牙電池 ESP32 0.96 英寸 OLED點亮屏幕
IOT砖家
2020-04-02 17:31:42
生成直線的Bresenham算法
blue0432
2020-02-21 18:47:33
生成直線的DDA算法
blue0432
2020-02-21 18:47:33
折半查找法(C語言)
blue0432
2020-02-21 18:47:33
I2C總線協議(轉載)
ljm2008
2018-08-30 12:07:07
新型的按鍵掃描程序,僅三行程序
blue0432
2018-08-30 10:39:03
NTC(負溫度)熱敏電阻.阻值的計算方式
blue0432
2018-08-30 10:38:58
富士通MB95F636H輸出PWM
蓝忧云枫
2018-08-27 11:16:10