1、BMP是什么?
BMP是 Bitmap(位圖) 的簡稱,是windows顯示圖片的基本格式。
在windows下,任何格式的圖片文件(包括視頻播放)都要轉(zhuǎn)化為位圖才能顯示出來,各種各樣格式的圖片文件也都是在位圖格式的基礎(chǔ)上采用不同的壓縮算法生成的。
BMP位圖可以實現(xiàn)不作任何變換地保存圖像像素域的數(shù)據(jù),是取得RAW數(shù)據(jù)(原始數(shù)據(jù))的重要來源。
2、像素點的三種顏色 R、G、B
一般在我們的生活中見到的圖像很多是以24位圖像為主,每個顏色點由R、G、B三種顏色混合組成,一張圖片就是由很多個這樣的顏色點組成。
如果這三種顏色各用8個bit來表示,那么這樣的圖像稱為真彩色,并且這個組成圖片的數(shù)據(jù)就是BMP位圖的圖片數(shù)據(jù)。
3、RGB顏色通道
在windows下面,RGB顏色矩陣的存儲格式是BGR。24位BMP圖像稱為真彩色圖像,這種位圖沒有調(diào)色板,并且每三個字節(jié)代表一個像素,分別對應(yīng)于R、G、B。
那么位圖中所能顯示的顏色就根據(jù)位的數(shù)量進行控制,它們的關(guān)系可以有下面幾種選項:
1、BitCount = 1
表示位圖最多有兩種顏色,缺省情況下是黑色和白色,你也可以自己定義這兩種顏色。圖像信息頭調(diào)色板中將有兩個調(diào)色板項,稱為索引0和索引1。圖像數(shù)據(jù)陣列中的每一位表示一個像素。如果一個位是0,顯示時就使用索引0的RGB值,如果位是1,則使用索引1的RGB值。
2、BitCount = 4
表示位圖最多有16種顏色。每個象素用4位表示,并用這4位作為彩色表的表項來查找該象素的顏色。
例如,如果位圖中的第一個字節(jié)為0x1F,它表示有兩個象素,第一象素的顏色就在彩色表的第2表項中查找,而第二個象素的顏色就在彩色表的第16表項中查找。此時,調(diào)色板中缺省情況下會有16個RGB項。對應(yīng)于索引0到索引15。
3、BitCount=8
表示位圖最多有256種顏色。每個象素用8位表示,并用這8位作為彩色表的表項來查找該象素的顏色。
例如,如果位圖中的第一個字節(jié)為0x1F,這個像素的顏色就在彩色表的第32表項中查找。此時,缺省情況下,調(diào)色板中會有256個RGB項,對應(yīng)于索引0到索引255。
4、BitCount=16
表示位圖最多有65536種顏色。每個色素用16位(2個字節(jié))表示。這種格式叫作高彩色,或叫增強型16位色,或64K色。它的情況比較復(fù)雜。
當(dāng) biCompression成員的值是BI_RGB時,它沒有調(diào)色板。16位中,最低的5位表示藍色分量,中間的5位表示綠色分量,高的5位表示紅色分量,一共占用了15位,最高的一位保留,設(shè)為0。這種格式也被稱作555。
當(dāng)biCompression成員的值是BI_BITFIELDS,那么情況就復(fù)雜了,首先是原來調(diào)色板的位置被三個DWORD變量占據(jù),稱為紅、綠、藍掩碼。分別用于描述紅、綠、藍分量在16位中所占的位置。
5、BitCount=24
表示位圖最多有2的24次方,大約1670萬種顏色。這種位圖沒有調(diào)色板(bmiColors成員尺寸為0),在位數(shù)組中,每3個字節(jié)代表一個象素,分別對應(yīng)于顏色R、G、B。
6、BitCount=32
表示位圖最多有2的32次方種顏色。這種位圖的結(jié)構(gòu)與16位位圖結(jié)構(gòu)非常類似。
當(dāng)biCompression成員的值是BI_RGB時,它也沒有調(diào)色板,32位中有24位用于存放RGB值,順序是:最高位—保留,紅8位、綠8位、藍8位。這種格式也被成為888。
當(dāng)biCompression成員的值是BI_BITFIELDS時,原來調(diào)色板的位置將被三個DWORD變量占據(jù),成為紅、綠、藍掩碼,分別用于描述紅、綠、藍分量在32位中所占的位置。
4、BMP位圖信息
BMP位圖包含的信息主要有:位圖文件頭、位圖信息頭、位圖數(shù)據(jù),它們的基本概況如下:
1)bmp文件頭(bmp file header):提供文件的格式、大小等信息
2)位圖信息頭(bitmap information):提供圖像數(shù)據(jù)的尺寸、位平面數(shù)、壓縮方式、顏色索引等信息
3)調(diào)色板(color palette):可選,如使用索引來表示圖像,調(diào)色板就是索引與其對應(yīng)的顏色的映射表
3)位圖數(shù)據(jù)(bitmap data):就是圖像數(shù)據(jù)
5、BMP位圖的C語言代碼解析
我們知道,一個BMP位圖它包含有幾部分的內(nèi)容信息,大致如下圖所示:
從圖中我們可以分析出,如果要獲取一個位圖的完整信息,需要分別獲取文件信息頭、位圖信息頭、位圖的RGB顏色數(shù)據(jù)。下面就簡單演示一些簡單的獲取BMP位圖信息的演示代碼。
(1)文件信息頭
文件信息頭主要存放包括bmp文件的標(biāo)識、大小等的信息。
獲取文件信息頭的數(shù)據(jù)結(jié)構(gòu)可以按照如下:
typedef struct BMP_FILE_HEADER
{
WORD bType; // 文件標(biāo)識符
DWORD bSize; // 文件的大小
WORD bReserved1; // 保留值,必須設(shè)置為0
WORD bReserved2; // 保留值,必須設(shè)置為0
DWORD bOffset; // 文件頭的最后到圖像數(shù)據(jù)位開始的偏移量,
//說明從文件頭開始到實際的圖象數(shù)據(jù)之間的字節(jié)的偏移量
//因為位圖信息頭和調(diào)色板的長度會根據(jù)不同情況而變化
//所以你可以用這個偏移值迅速的從文件中讀取到位數(shù)據(jù)
} BMPFILEHEADER; // 14 字節(jié)
這個結(jié)構(gòu)體的解析如下:
(2)位圖信息頭
位圖信息頭主要存放有關(guān)位圖的圖像數(shù)據(jù)尺寸、位平面數(shù)、壓縮方式、顏色索引等信息。
位圖信息頭的數(shù)據(jù)結(jié)構(gòu)定義如下:
typedef struct BMP_INFO
{
DWORD bInfoSize; // 信息頭的大小
DWORD bWidth; // 圖像的寬度
DWORD bHeight; // 圖像的高度,如果該值是一個正數(shù),說明圖像是倒向的,如果該值是一個負(fù)數(shù),則說明圖像是正向的。
WORD bPlanes; // 圖像的位面數(shù),其值將總是被設(shè)為1
WORD bBitCount; // 每個像素的位數(shù),這里為 24位
DWORD bCompression; // 壓縮類型
DWORD bmpImageSize; // 圖像的大小,以字節(jié)為單位
DWORD bXPelsPerMeter; // 水平分辨率
DWORD bYPelsPerMeter; // 垂直分辨率
DWORD bClrUsed; // 位圖實際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,則說明使用所有調(diào)色板項)
DWORD bClrImportant; // 對圖象顯示有重要影響的顏色索引的數(shù)目,如果是0,表示都重要
} BMPINF; // 40 字節(jié)
這個結(jié)構(gòu)體的解析如下:
(3)RGB顏色陣列
RGB顏色陣列指的是BMP位圖的數(shù)據(jù),是整個圖片最終顯示出來的效果。
-
RGB
+關(guān)注
關(guān)注
4文章
801瀏覽量
58731 -
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137801 -
BMP
+關(guān)注
關(guān)注
0文章
48瀏覽量
17105 -
RAW
+關(guān)注
關(guān)注
0文章
21瀏覽量
3846
發(fā)布評論請先 登錄
相關(guān)推薦
C語言結(jié)構(gòu)體描述BMP的文件格式
【安富萊】【STemWin教程】第11章 BMP圖片顯示
1hid設(shè)備報告的usage minimum定義中bitmap是位圖的意思嗎為什么hid設(shè)備和位圖有關(guān)
位圖顯示問題如何解決
介紹內(nèi)部EEPROM數(shù)據(jù)讀取和解析
BMP解碼具體解析
BMPtoPCB軟件的免費下載(bmp位圖轉(zhuǎn)PCB文件工具)
![BMPtoPCB軟件的免費下載(<b class='flag-5'>bmp</b><b class='flag-5'>位圖</b>轉(zhuǎn)PCB文件工具)](https://file.elecfans.com/web2/M00/49/6C/poYBAGKhwLGAGNDTAABGZeRykfk657.png)
stm32單片機OLED顯示圖片 位圖轉(zhuǎn)換 Image2Lcd使用
![stm32單片機OLED顯示圖片 <b class='flag-5'>位圖</b>轉(zhuǎn)換 Image2Lcd使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux下BMP圖片添加水印
![Linux下<b class='flag-5'>BMP</b>圖片添加水印](https://file.elecfans.com//web2/M00/60/E2/poYBAGL7DPSAHOn2AAUqcqri3HY327.png)
linux下BMP圖片旋轉(zhuǎn)
![linux下<b class='flag-5'>BMP</b>圖片旋轉(zhuǎn)](https://file.elecfans.com//web2/M00/61/7F/pYYBAGL7DpKAN-59AAW-S7JQP7Y674.png)
Linux下BMP圖片截圖
Linux下BMP圖片縮放
![Linux下<b class='flag-5'>BMP</b>圖片縮放](https://file.elecfans.com//web2/M00/63/35/pYYBAGL-AxCAEpmsAAfuT1ITYqk820.png)
評論