BMP檔案解析
BMP檔案通常是不壓縮的,所以它們通常比同一幅影象的壓縮影象檔案格式要大很多。例如,一個800×600的24位幾乎佔據1.4MB空間。因此它們通常不適合在因特網或者其他低速或者有容量限制的媒介上進行傳輸。
根據顏色深度的不同,影象上的一個畫素可以用一個或者多個位元組表示,它由n/8所確定(n是位深度,1位元組包含8個數據位)。圖片瀏覽器等基於位元組的ASCII值計算畫素的顏色,然後從調色盤中讀出相應的值。更為詳細的資訊請參閱下面關於點陣圖檔案的部分。
n位2n種顏色的包含調色盤的點陣圖近似位元組數可以用下面的公式計算:
BMP檔案大小,其中高度(height)和寬度(width)都以畫素為單位。
需要注意的是上面公式中的54
BMP檔案大小,其中高度(height)和寬度(width)都以畫素為單位。
另外需要注意的是這是一個近似值,對於n位的點陣圖影象來說,儘管可能有最多2(^n)種顏色,一個特定的影象可能並不會使用這些所有的顏色。由於彩色調色盤僅僅定義了影象所用的顏色,所以實際的彩色調色盤將小於4*2(^n)。
如果想知道這些值是如何得到的,請參考下面檔案格式的部分。
由於儲存演算法本身決定的因素,根據幾個影象引數的不同計算出的大小與實際的檔案大小將會有一些細小的差別。
BMP檔案如果畫素色深是8位及以下,那麼會採用調色盤形成索引點陣圖,否則不會採用調色盤。
1.BMP的標頭檔案[必須】:
typedef struct tagBITMAPFILEHEADER {
WORD bfType; // 42 4D是windows BMP檔案標識,其它的檔案還有其它的標識
DWORD bfSize; // 整個檔案的大小
WORD bfReserved1; // 保留位不使用,為0
WORD bfReserved2; // 保留位不使用,為0
DWORD bfOffBits; // 點陣圖資料檔案,在整個檔案中的偏移(跳過BMP頭,點陣圖頭,調色盤(如果有))
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
2.BMP點陣圖資訊頭說明檔案[必須]:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 資訊頭的大小
LONG biWidth; // 影象資料寬度,單位是畫素
LONG biHeight;// 影象資料高度,單位是畫素,且如果是正數那麼是倒向的點陣圖,也就是2D螢幕座標系翻轉類似物體座標系(y軸由下到上,點陣圖資料也由左下角一行行的存放),如果是負數,那麼影象是正向的,也就是2D螢幕座標系(y軸由上到下,點陣圖資料也由左上角一行行存放).
WORD biPlanes; // 顏色平面數,總是1
WORD biBitCount; // 每個畫素的位元數,一般是8,16,24,32;8的話一般包含調色盤,其它位數多的,調色盤太大了,一般不用。
DWORD biCompression; //0不壓縮;1,2位元遊程編碼就是霍夫曼編碼上的值+重複數標記; 3是位元域編碼減少位元組的使用,4是點陣圖包含JPEG影象用於列印,5是點陣圖包含PNG影象用於列印。
DWORD biSizeImage; // 影象資料的位元組數大小。
LONG biXPelsPerMeter; // 水平解析度,畫素/米,給列印參考或顯示縮放圖片相容用的,具體螢幕上的顯示大小會根據畫素數/螢幕畫素密度得到。
LONG biYPelsPerMeter;// 垂直解析度,畫素/米,給列印參考或顯示縮放圖片相容用的,具體螢幕上的顯示大小會根據畫素數/螢幕畫素密度得到。
DWORD biClrUsed; // 說明點陣圖實際使用的調色盤中的顏色索引數如果是8位一畫素那麼這裡是256;為0採用所用調色盤中的索引或者沒有調色盤。
DWORD biClrImportant; // 調色盤中對影象顯示有重要影響的顏色索引數如果是8位一畫素那麼這裡是256;為0都重要,或者沒有調色盤。
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
3.調色盤[可選]