BMP 儲存個人理解
<第一部分>位圖文件頭BITMAPFILEHEADER,此結構長度固定占14字節
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
變量 | 大小(共14字節) | 作用 |
bfType | 2bytes |
文件類型說明,可取值: BM - windows 3.1x,95,NT,... BA - OS/2 Bitmap Array CI - OS/2 Color Icon CP - OS/2 Color Pointer IC - OS/2 Icon PT - OS/2 Pointer |
bfsize | 4bytes | 說明文件大小,單位:byte |
bfReserved1 | 2bytes | 保留,必須設置為0 |
bfReserved2 | 2bytes | 保留,必須設置為0 |
bfOffBits | 4bytes |
說明從文件頭到實際圖像數據之間的字節偏移量。 因為位圖信息頭和調色板的長度不是固定的,有助於迅速定位位圖數據 |
<第二部分>為位圖信息頭BITMAPINFOHEADER,也是一個結構,其定義如下:
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;
變量 | 大小 | 作用 |
biSize | 4 bytes | BITMAPINFOHEADER結構需要的字節數 |
biWidth | 4 bytes | 圖像寬度,像素為單位 |
biHeight | 4 bytes |
圖像高度,像素為單位 註:如果該值為正數,說明圖像是倒向的;為負數,圖像是正向的 大多數bmp圖像是倒向的位圖; |
biPlanes | 2 bytes | 為目標設備說明顏色平面數,值為1 |
biBitCount | 2 bytes | 說明比特數/像素,為1,4,8,16,24或32 |
biCompression | 4 bytes |
說明圖像數據壓縮類型,取值範圍: 0 BI_RGB 不壓縮 1 BI_RLE8 8比特遊程編碼(RLE),只用於8位位圖 2 BI_RLE4 4比特遊程編碼(RLE),只用於4位位圖 3 BI_BITFIELDS 比特域,用於16/32位位圖 4 BI_JPEG JPEG位圖含jpeg圖像(僅用於打印機) 5 BI_PNG PNG位圖含png圖像(僅用於打印機) |
biSizeImage | 4 bytes | 說明圖像大小 biSizeImage=biWidth’ × biHeight,單位字節,當用BI_RGB時,可設置為0 |
biXPelsPerMeter | 4 bytes | 說明水平分辨率(像素/米),有符整數 |
biYPelsPerMeter | 4 bytes | 說明垂直分辨率(像素/米),有符整數 |
biClrUsed | 4 bytes | 說明位圖實際使用的色彩表中的顏色索引,為0看後續說明 |
biClrImportant | 4 bytes | 說明對圖像顯示有重要影響的顏色索引數目,為0表示都重要 |
<第三部分>為調色板Palette,當然,這裏是對那些需要調色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色板的,BITMAPINFOHEADER後直接是位圖數據。可以理解為biClrUsed參數不為0時,有調色板。
調色板實際上是一個數組,共有biClrUsed個元素(如果該值為零,則有2biBitCount個元素)。數組中每個元素的類型是一個RGBQUAD結構,占4個字節,其定義如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue; //該顏色的藍色分量
BYTE rgbGreen; //該顏色的綠色分量
BYTE rgbRed; //該顏色的紅色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
比如索引值biClrUsed為64,即有64個調色盤,則總偏移量計算14bytes+40bytes+64*4bytes=310bytes
<第四部分>實際的圖象數據。
(1)對於用到調色板的位圖,圖象數據就是該象素顏在調色板中的索引值。即某一點只儲存一個索引值,按照這個索引值在調色板中查找對應像素作為它的像素
(2)對於真彩色圖,圖象數據就是實際的R、G、B值。下面針對2色、16色、256色位圖和真彩色位圖分別介紹。 每個像素點都是按調色板的格式儲存的,也可以理解為全是調色板
對於2色位圖,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),所以一個字節可以表示8個象素。
對於16色位圖,用4位可以表示一個象素的顏色,所以一個字節可以表示2個象素。
對於256色位圖,一個字節剛好可以表示1個象素。
要註意兩點:
(1) 每一行的字節數必須是4的整倍數,如果不是,則需要補齊。這在前面介紹biSizeImage時已經提到了。
(2) 一般來說,.BMP文件的數據從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面一行的左邊第一個象素,然後是左邊第二個象素……接下來是倒數第二行左邊第一個象素,左邊第二個象素……依次類推 ,最後得到的是最上面一行的最右一個象素。
<對齊>
Windows默認的掃描的最小單位是4字節,如果數據對齊滿足這個值能夠大幅提升圖像讀取速度。因此,BMP圖像順應了這個要求,要求每行的數據的長度必須是4的倍數,如果不夠需要進行比特填充(以0填充)。填充後的每行的字節數為:rowsize=4*ceil(BPP*Width/32)
<其他情況>
上述主要是PC機上的位圖文件的構成,對於嵌入式平臺,可能在調色板數據段與PC機的不同。如在嵌入式平臺上常見的16位r5g6b5位圖實際上采用的掩模的方式而不是索引的方式來表示圖像。此時,在調色板數據段共有四個部分,每個部分為四個字節,實際表示的是彩色版規範。即:
第一個部分是紅色分量的掩模
第二個部分是綠色分量的掩模
第三個部分是藍色分量的掩模
第四個部分是Alpha分量的掩模(缺省為0)
1111100000000000(二進制),是藍紅分量的掩碼。
0000011111100000(二進制),是綠色分量的掩碼。
0000000000011111(二進制),是藍色分量的掩碼。
在每個像素值的兩個字節16位中,按從高到低取5、6、5位分別就是r、g、b分量值;把分量值r、g、b值分別左移操作3、2、3位就可以補齊每個分量為一個字節,再把這三個字節按BGR組合,就可以轉換為24位標準BMP格式
BMP 儲存個人理解