BMP是一種與硬件設(shè)備無關(guān)的圖像文件格式,使用非常廣。它采用位映射存儲(chǔ)格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BblP文件所占用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲(chǔ)數(shù)據(jù)時(shí),圖像的掃描方式是按從左到右、從下到上的順序。
創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信小程序定制開發(fā)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。由于BMP文件格式是Windows環(huán)境中交換與圖有關(guān)的數(shù)據(jù)的一種標(biāo)準(zhǔn),因此在Windows環(huán)境中運(yùn)行的圖形圖像軟件都支持BMP圖像格式。
典型的BMP圖像文件由三部分組成:位圖文件頭數(shù)據(jù)結(jié)構(gòu),它包含BMP圖像文件的類型、顯示內(nèi)容等信息;位圖信息數(shù)據(jù)結(jié)構(gòu),它包含有BMP圖像的寬、高、壓縮方法,以及定義顏色等信息。
具體數(shù)據(jù)舉例:
如某BMP文件開頭:
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 …. ….
BMP文件可分為四個(gè)部分:位圖文件頭、位圖信息頭、彩色板、圖像數(shù)據(jù)陣列,在上圖中已用*分隔。
一、圖像文件頭
1)1:圖像文件頭。424Dh=”BM”,表示是Windows支持的BMP格式。
2)2-3:整個(gè)文件大小。4690 0000,為00009046h=36934。
3)4-5:保留,必須設(shè)置為0。
4)6-7:從文件開始到位圖數(shù)據(jù)之間的偏移量。4600 0000,為00000046h=70,上面的文件頭就是35字=70字節(jié)。
5)8-9:位圖圖信息頭長度。
6)10-11:位圖寬度,以像素為單位。8000 0000,為00000080h=128。
7)12-13:位圖高度,以像素為單位。9000 0000,為00000090h=144。
8)14:位圖的位面數(shù),該值總是1。0100,為0001h=1。
二、位圖信息頭
9)15:每個(gè)像素的位數(shù)。有1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強(qiáng)型真彩色)。1000為0010h=16。
10)16-17:壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。RLE簡單地說是采用像素?cái)?shù)+像素值的方式進(jìn)行壓縮。T408采用的是位域存放方式,用兩個(gè)字節(jié)表示一個(gè)像素,位域分配為r5b6g5。圖中0300 0000為00000003h=3。
11)18-19:用字節(jié)數(shù)表示的位圖數(shù)據(jù)的大小,該數(shù)必須是4的倍數(shù),數(shù)值上等于位圖寬度×位圖高度×每個(gè)像素位數(shù)。0090 0000為00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000為0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000為0000 0FA0h=4000。
14)24-25:位圖使用的顏色索引數(shù)。設(shè)為0的話,則說明使用所有調(diào)色板項(xiàng)。
15)26-27:對(duì)圖象顯示有重要影響的顏色索引的數(shù)目。如果是0,表示都重要。
三、彩色板 (非必有)
16)28-35:彩色板規(guī)范。對(duì)于調(diào)色板中的每個(gè)表項(xiàng),用下述方法來描述RGB的值:
1字節(jié)用于藍(lán)色分量
1字節(jié)用于綠色分量
1字節(jié)用于紅色分量
1字節(jié)用于填充符(設(shè)置為0)
對(duì)于24-位真彩×××像就不使用彩色板,因?yàn)槲粓D中的RGB值就代表了每個(gè)象素的顏色。
如,彩色板為00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000為FB00h=1111100000000000(二進(jìn)制),是紅色分量的掩碼。
E007 0000為 07E0h=0000011111100000(二進(jìn)制),是綠色分量的掩碼。
1F00 0000為001Fh=0000000000011111(二進(jìn)制),是紅色分量的掩碼。
0000 0000總設(shè)置為0。
將掩碼跟像素值進(jìn)行“與”運(yùn)算再進(jìn)行移位操作就可以得到各色分量值??纯囱诖a,就可以明白事實(shí)上在每個(gè)像素值的兩個(gè)字節(jié)16位中,按從高到低取5、6、5位分別就是r、g、b分量值。取出分量值后把r、g、b值分別乘以8、4、8就可以補(bǔ)齊第個(gè)分量為一個(gè)字節(jié),再把這三個(gè)字節(jié)按rgb組合,放入存儲(chǔ)器(同樣要反序),就可以轉(zhuǎn)換為24位標(biāo)準(zhǔn)BMP格式了。
四、圖像數(shù)據(jù)陣列
17)17-...:每兩個(gè)字節(jié)表示一個(gè)像素。陣列中的第一個(gè)字節(jié)表示位圖左下角的象素,而最后一個(gè)字節(jié)表示位圖右上角的象素。
下面用winhex打開一個(gè)bmp文件,察看其16進(jìn)制數(shù)據(jù)。
一個(gè)bmp文件以BITMAPFILEHEADER結(jié)構(gòu)體開始,(frombyte.com)BITMAPFILEHEADER的第1個(gè)屬性是bfType(2字節(jié)),這里恒定等于0x4D42。由于內(nèi)存中的數(shù)據(jù)排列高位在左,低位在右,所以內(nèi)存中從左往右看就顯示成(42 4D),所以在winhex中頭兩個(gè) 字節(jié)顯示為(42 4D)就是這樣形成的,以后的數(shù)據(jù)都是這個(gè)特點(diǎn),不再作重復(fù)說明。
BITMAPFILEHEADER的第2個(gè)屬性是bfSize(4字節(jié)),表示整個(gè)bmp文件的大小,這里等于0x000004F8=1272字節(jié)。
BITMAPFILEHEADER的第3個(gè)、第4個(gè)屬性分別是bfReserved1、bfReserved2(各2字節(jié)),這里是2個(gè)保留屬性,都為0,這里等于&H0000、0×0000。
BITMAPFILEHEADER的第5個(gè)屬性是bfOffBits(4字節(jié)),表示DIB數(shù)據(jù)區(qū)在bmp文件中的位置偏移量,這里等于0×00000076=118,表示數(shù)據(jù)區(qū)從文件開始往后數(shù)的118字節(jié)開始。
BITMAPFILEHEADER結(jié)構(gòu)體這里就講完了,大家會(huì)發(fā)現(xiàn)BITMAPFILEHEADER只占了bmp文件開始的14字節(jié)長度,但需要 特別說明的是在vb中定義一個(gè)BITMAPFILEHEADER結(jié)構(gòu)體變量,其長度占了16個(gè)字節(jié),原因就是第1個(gè)屬性本來應(yīng)該只分配2個(gè)字節(jié),但實(shí)際被 分配了4個(gè)字節(jié),多出來2個(gè)字節(jié),所以如果想保存一張bmp圖片,寫入BITMAPFILEHEADER結(jié)構(gòu)體時(shí)一定要注意這一點(diǎn)。
接下來是BITMAPINFO結(jié)構(gòu)體部分。BITMAPINFO(frombyte.com)段由兩部分組成:BITMAPINFOHEADER結(jié)構(gòu)體和RGBQUAD結(jié)構(gòu) 體。其中RGBQUAD結(jié)構(gòu)體表示圖片的顏色信息,有些時(shí)候可以省略,一般的24位圖片和32位圖片都不帶RGBQUAD結(jié)構(gòu)體,因?yàn)镈IB數(shù)據(jù)區(qū)直接表 示的RGB值,一般4位圖片和8位圖片才帶有RGBQUAD結(jié)構(gòu)體。(多少位的圖片就是用多少位來表示一個(gè)顏色信息,例如4位圖片表示用4個(gè)bit來表示 一個(gè)顏色信息。)一個(gè)bmp文件中有沒有RGBQUAD結(jié)構(gòu)體,可以根據(jù)前面BITMAPFILEHEADER結(jié)構(gòu)體的第5個(gè)屬性bfOffBits來判 斷,因?yàn)锽ITMAPINFOHEADER結(jié)構(gòu)體長度為40bit,如果BITMAPINFOHEADER結(jié)構(gòu)體結(jié)束后還未到DIB數(shù)據(jù)區(qū)的偏移量,就說 明接下來的數(shù)據(jù)是RGBQUAD結(jié)構(gòu)體部分。這里講的C:\WINDOWS\Blue Lace 16.bmp是一個(gè)4bit圖片,所以它帶有 RGBQUAD結(jié)構(gòu)體。
下面進(jìn)入正題BITMAPINFOHEADER部分。
BITMAPINFOHEADER的第1個(gè)屬性是biSize(4字節(jié)),表示BITMAPINFOHEADER結(jié)構(gòu)體的長度,最常見的長度是40字節(jié),UltraEdit中可以看到緊接著的4個(gè)字節(jié)等于0×00000028=40字節(jié)。
BITMAPINFOHEADER的第2個(gè)屬性是biWidth(4字節(jié)),表示bmp圖片的寬度,這里等于0×00000030=48像素。
BITMAPINFOHEADER的第3個(gè)屬性是biHeight(4字節(jié)),表示bmp圖片的高度,這里等于0×00000030=48像素。
BITMAPINFOHEADER的第4個(gè)屬性是biPlanes(2字節(jié)),表示bmp圖片的平面屬,顯然顯示器只有一個(gè)平面,所以恒等于1,這里等于0×0001。
BITMAPINFOHEADER的第5個(gè)屬性是biBitCount(2字節(jié)),表示bmp圖片的顏色位數(shù),即24位圖、32位圖等等。這里等于0×0004,表示該圖片為4位圖。
BITMAPINFOHEADER的第6個(gè)屬性是biCompression(4字節(jié)),表示圖片的壓縮屬性,bmp圖片是不壓縮的,等于0,所以這里為0×00000000。
BITMAPINFOHEADER的第7個(gè)屬性是biSizeImage(4字節(jié)),表示bmp圖片數(shù)據(jù)區(qū)的大小,當(dāng)上一個(gè)熟悉biCompression等于0時(shí),這里的值可以省略不填,所以這里等于0×00000000。
BITMAPINFOHEADER的第8個(gè)屬性是biXPelsPerMeter(4字節(jié)),表示圖片X軸每米多少像素,可省略,這里等于0x00000EC3=3779像素/米。
BITMAPINFOHEADER的第9個(gè)屬性是biYPelsPerMeter(4字節(jié)),表示圖片Y軸每米多少像素,可省略,這里等于0x00000EC3=3779像素/米。
BITMAPINFOHEADER的第10個(gè)屬性是biClrUsed(4字節(jié)),表示使用了多少個(gè)顏色索引表,一般biBitCount屬性小于16才會(huì)用到,等于0時(shí)表示有2^biBitCount(frombyte.com)個(gè)顏色索引表,所以這里仍等于0×00000000。
BITMAPINFOHEADER的第11個(gè)屬性是biClrImportant(4字節(jié)),表示有多少個(gè)重要的顏色,等于0時(shí)表示所有顏色都很重要,所以這里等于0×00000000。
至此BITMAPINFOHEADER結(jié)構(gòu)體結(jié)束。
由于這個(gè)圖片到這里還未到達(dá)DIB數(shù)據(jù)區(qū)的偏移量,所以接下來的部分是RGBQUAD結(jié)構(gòu)體。RGBQUAD結(jié)構(gòu)體由4個(gè)字節(jié)型數(shù)據(jù)組成,所以一 個(gè)RGBQUAD結(jié)構(gòu)體只占用4字節(jié)空間,從左到右每個(gè)字節(jié)依次表示(藍(lán)色,綠色,紅色,未使用)。舉例的這個(gè)圖片我數(shù)了數(shù)總共有16個(gè)RGBQUAD結(jié) 構(gòu)體,由于該圖片是4位圖,2^4正好等于16,所以它把16種顏色全部都枚舉出來了,這些顏色就是一個(gè)顏色索引表。顏色索引表編號(hào)從0開始,總共16個(gè) 顏色,所以編號(hào)為0-15。從winhex中可以看到按照順序,這16個(gè)RGBQUAD結(jié)構(gòu)體依次為:
編號(hào):(藍(lán),綠,紅,空)
0號(hào):(00,00,00,00)
1號(hào):(00,00,80,00)
2號(hào):(00,80,00,00)
3號(hào):(00,80,80,00)
4號(hào):(80,00,00,00)
5號(hào):(80,00,80,00)
6號(hào):(80,80,00,00)
7號(hào):(80,80,80,00)
8號(hào):(C0,C0,C0,00)
9號(hào):(00,00,F(xiàn)F,00)
10號(hào):(00,F(xiàn)F,00,00)
11號(hào):(00,F(xiàn)F,F(xiàn)F,00)
12號(hào):(FF,00,00,00)
13號(hào):(FF,00,F(xiàn)F,00)
14號(hào):(FF,F(xiàn)F,00,00)
15號(hào):(FF,F(xiàn)F,F(xiàn)F,00)
為了更直觀的表示這些顏色,可以見后面的圖片。
到這里,正好滿足DIB數(shù)據(jù)區(qū)的偏移量,所以后面的字節(jié)就是圖片內(nèi)容了。這里需要提醒的是所有的DIB數(shù)據(jù)掃描行是上下顛倒的,也就是說一幅圖片先繪制底部的像素,再繪制頂部的像素,所以這些DIB數(shù)據(jù)所表示的像素點(diǎn)就是從圖片的左下角開始,一直表示到圖片的右上角。
由于這里的圖片是4位圖片,也就是說4bit就表示一個(gè)像素,一個(gè)字節(jié)有8個(gè)bit,所以一個(gè)字節(jié)能表示2個(gè)像素。
從winhex中可以看到,DIB數(shù)據(jù)區(qū)第一個(gè)字節(jié)是0×44,16進(jìn)制正好是將2進(jìn)制數(shù)每4個(gè)一組書寫的,跟4bit圖片正好吻 合,所以0×44表示兩個(gè)像素,高位的4表示第一個(gè)像素,低位的4表示第二個(gè)像素。這里的4不是表示RGB顏色,而是表示顏色索引號(hào)為4,由于索 引號(hào)從0開始編號(hào)的,所以4表示索引表中第5個(gè)顏色,從附圖中可以看到索引號(hào)為4的是藍(lán)色。這是第一字節(jié),表示的是圖片左下角開始2個(gè)像素,如果有 PhotoShop打開這個(gè)圖片可以看到,左下角2個(gè)像素取出來的顏色RGB值正好等于索引表中第5個(gè)顏色的RGB值。后面的DIB數(shù)據(jù)以此類推。
至此一個(gè)bmp圖片就全部解析完了,根據(jù)這些信息就可以完整的繪制一張bmp圖片來。當(dāng)然也可以簡單手工修復(fù)一個(gè)破壞不算嚴(yán)重的BMP文件!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞標(biāo)題:北亞工程師詳細(xì)解說BMP文件格式-創(chuàng)新互聯(lián)
文章鏈接:http://aaarwkj.com/article42/isiec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、App開發(fā)、網(wǎng)站維護(hù)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容