1、BMP是什么?
BMP是 Bitmap(位圖) 的簡稱,是windows顯示圖片的基本格式。
在windows下,任何格式的圖片文件(包括視頻播放)都要轉化為位圖才能顯示出來,各種各樣格式的圖片文件也都是在位圖格式的基礎上采用不同的壓縮算法生成的。
BMP位圖可以實現不作任何變換地保存圖像像素域的數據,是取得RAW數據(原始數據)的重要來源。
2、像素點的三種顏色 R、G、B
一般在我們的生活中見到的圖像很多是以24位圖像為主,每個顏色點由R、G、B三種顏色混合組成,一張圖片就是由很多個這樣的顏色點組成。
如果這三種顏色各用8個bit來表示,那么這樣的圖像稱為真彩色,并且這個組成圖片的數據就是BMP位圖的圖片數據。
3、RGB顏色通道
在windows下面,RGB顏色矩陣的存儲格式是BGR。24位BMP圖像稱為真彩色圖像,這種位圖沒有調色板,并且每三個字節代表一個像素,分別對應于R、G、B。
那么位圖中所能顯示的顏色就根據位的數量進行控制,它們的關系可以有下面幾種選項:
1、BitCount = 1
表示位圖最多有兩種顏色,缺省情況下是黑色和白色,你也可以自己定義這兩種顏色。圖像信息頭調色板中將有兩個調色板項,稱為索引0和索引1。圖像數據陣列中的每一位表示一個像素。如果一個位是0,顯示時就使用索引0的RGB值,如果位是1,則使用索引1的RGB值。
2、BitCount = 4
表示位圖最多有16種顏色。每個象素用4位表示,并用這4位作為彩色表的表項來查找該象素的顏色。
例如,如果位圖中的第一個字節為0x1F,它表示有兩個象素,第一象素的顏色就在彩色表的第2表項中查找,而第二個象素的顏色就在彩色表的第16表項中查找。此時,調色板中缺省情況下會有16個RGB項。對應于索引0到索引15。
3、BitCount=8
表示位圖最多有256種顏色。每個象素用8位表示,并用這8位作為彩色表的表項來查找該象素的顏色。
例如,如果位圖中的第一個字節為0x1F,這個像素的顏色就在彩色表的第32表項中查找。此時,缺省情況下,調色板中會有256個RGB項,對應于索引0到索引255。
4、BitCount=16
表示位圖最多有65536種顏色。每個色素用16位(2個字節)表示。這種格式叫作高彩色,或叫增強型16位色,或64K色。它的情況比較復雜。
當 biCompression成員的值是BI_RGB時,它沒有調色板。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分量,一共占用了15位,最高的一位保留,設為0。這種格式也被稱作555。
當biCompression成員的值是BI_BITFIELDS,那么情況就復雜了,首先是原來調色板的位置被三個DWORD變量占據,稱為紅、綠、藍掩碼。分別用于描述紅、綠、藍分量在16位中所占的位置。
5、BitCount=24
表示位圖最多有2的24次方,大約1670萬種顏色。這種位圖沒有調色板(bmiColors成員尺寸為0),在位數組中,每3個字節代表一個象素,分別對應于顏色R、G、B。
6、BitCount=32
表示位圖最多有2的32次方種顏色。這種位圖的結構與16位位圖結構非常類似。
當biCompression成員的值是BI_RGB時,它也沒有調色板,32位中有24位用于存放RGB值,順序是:最高位—保留,紅8位、綠8位、藍8位。這種格式也被成為888。
當biCompression成員的值是BI_BITFIELDS時,原來調色板的位置將被三個DWORD變量占據,成為紅、綠、藍掩碼,分別用于描述紅、綠、藍分量在32位中所占的位置。
4、BMP位圖信息
BMP位圖包含的信息主要有:位圖文件頭、位圖信息頭、位圖數據,它們的基本概況如下:
1)bmp文件頭(bmp file header):提供文件的格式、大小等信息
2)位圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息
3)調色板(color palette):可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表
3)位圖數據(bitmap data):就是圖像數據
5、BMP位圖的C語言代碼解析
我們知道,一個BMP位圖它包含有幾部分的內容信息,大致如下圖所示:
從圖中我們可以分析出,如果要獲取一個位圖的完整信息,需要分別獲取文件信息頭、位圖信息頭、位圖的RGB顏色數據。下面就簡單演示一些簡單的獲取BMP位圖信息的演示代碼。
(1)文件信息頭
文件信息頭主要存放包括bmp文件的標識、大小等的信息。
獲取文件信息頭的數據結構可以按照如下:
typedef struct BMP_FILE_HEADER
{
WORD bType; // 文件標識符
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必須設置為0
WORD bReserved2; // 保留值,必須設置為0
DWORD bOffset; // 文件頭的最后到圖像數據位開始的偏移量,
//說明從文件頭開始到實際的圖象數據之間的字節的偏移量
//因為位圖信息頭和調色板的長度會根據不同情況而變化
//所以你可以用這個偏移值迅速的從文件中讀取到位數據
} BMPFILEHEADER; // 14 字節
這個結構體的解析如下:
(2)位圖信息頭
位圖信息頭主要存放有關位圖的圖像數據尺寸、位平面數、壓縮方式、顏色索引等信息。
位圖信息頭的數據結構定義如下:
typedef struct BMP_INFO
{
DWORD bInfoSize; // 信息頭的大小
DWORD bWidth; // 圖像的寬度
DWORD bHeight; // 圖像的高度,如果該值是一個正數,說明圖像是倒向的,如果該值是一個負數,則說明圖像是正向的。
WORD bPlanes; // 圖像的位面數,其值將總是被設為1
WORD bBitCount; // 每個像素的位數,這里為 24位
DWORD bCompression; // 壓縮類型
DWORD bmpImageSize; // 圖像的大小,以字節為單位
DWORD bXPelsPerMeter; // 水平分辨率
DWORD bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)
DWORD bClrImportant; // 對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要
} BMPINF; // 40 字節
這個結構體的解析如下:
(3)RGB顏色陣列
RGB顏色陣列指的是BMP位圖的數據,是整個圖片最終顯示出來的效果。
-
RGB
+關注
關注
4文章
798瀏覽量
58461 -
C語言
+關注
關注
180文章
7604瀏覽量
136692 -
BMP
+關注
關注
0文章
48瀏覽量
17060 -
RAW
+關注
關注
0文章
21瀏覽量
3800
發布評論請先 登錄
相關推薦
評論