BMP 和 DIB
原文轉(zhuǎn)載鏈接 ? ?http://blog.sina.com.cn/s/blog_6c5a47d30102uxp6.html
現(xiàn)在我們常見到的.bmp圖像,成為位圖(Bitmap)。位圖在內(nèi)存中有兩種類型,即:設(shè)備相關(guān)位圖(DDB:Device-independent bitmaps)和設(shè)備無關(guān)位圖(DIB:Device-independent bitmaps)?!究梢赃@樣理解,這種圖像在硬盤上被稱為BMP圖,在內(nèi)存中則被叫做DDB或DIB。】
DDB位圖在早期的Windows系統(tǒng)(Windows 3.0以前)中是很普遍的,事實(shí)上它也是唯一的。然而,隨著顯示器制造技術(shù)的進(jìn)步,以及顯示設(shè)備的多樣化,DDB位圖的一些固有的問題開始浮現(xiàn)出來了。比如,它不能夠存儲(chǔ)(或者說獲取)創(chuàng)建這張圖片的原始設(shè)備的分辨率,這樣,應(yīng)用程序就不能快速的判斷客戶機(jī)的顯示設(shè)備是否適合顯示這張圖片。為了解決這一難題,微軟創(chuàng)建了DIB位圖格式。
換言之,我們現(xiàn)在電腦里面的.bmp圖基本上可以都認(rèn)為是DIB。A bitmap image file loaded into memory becomes a DIB data structure
?
BMP 由以下幾部分組成:【可以先看本頁最后的圖】
請(qǐng)注意:1,2,3,4組成了BMP,2,3,4組成了DIB
1.BMP文件頭:
BMP文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型、文件大小和位圖起始位置等信息。
其結(jié)構(gòu)定義如下:
2. DIB頭
BMP位圖信息頭數(shù)據(jù)用于說明位圖的尺寸等信息。下面兩個(gè)圖,左邊是C++里的定義及意義,后面的是實(shí)際的存儲(chǔ)。
??3. 調(diào)色板
用于說明位圖中的顏色,它有若干個(gè)表項(xiàng),每一個(gè)表項(xiàng)是一個(gè)RGBQUAD類型的結(jié)構(gòu),定義一種顏色。RGBQUAD結(jié)構(gòu)的定義如下:
?
顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個(gè)數(shù)有biBitCount來確定:
當(dāng)biBitCount=1,4,8時(shí),分別有2,16,256個(gè)表項(xiàng);
當(dāng)biBitCount=24時(shí),沒有顏色表項(xiàng)。
?
位圖信息頭和顏色表組成位圖信息,BITMAPINFO結(jié)構(gòu)定義如下:
?
4. 位圖數(shù)據(jù),即像素值
位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值,記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上。位圖的一個(gè)像素值所占的字節(jié)數(shù):
當(dāng)biBitCount=1時(shí),8個(gè)像素占1個(gè)字節(jié);
當(dāng)biBitCount=4時(shí),2個(gè)像素占1個(gè)字節(jié);
當(dāng)biBitCount=8時(shí),1個(gè)像素占1個(gè)字節(jié);
當(dāng)biBitCount=24時(shí),1個(gè)像素占3個(gè)字節(jié),按順序分別為B,G,R;
當(dāng)biBitCount=32時(shí),1個(gè)像素占4個(gè)字節(jié),按順序分別為B,G,R,α;α表示透明度,黑為全透明,白為不透明,灰色為半透明
Windows規(guī)定一個(gè)掃描行所占的字節(jié)數(shù)必須是4的倍數(shù)(即以long為單位),不足的以0填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
?
只要把這四塊信息寫好,圖像就是沒問題的,還有一些可缺省的項(xiàng),詳見參考1.
?
參考:
1.?http://en.wikipedia.org/wiki/Device-independent_bitmap
2.?http://baike.baidu.com/subview/7671/8245150.htm
?
總結(jié)
- 上一篇: 模糊照片修复软件有什么?这些软件大家都在
- 下一篇: Sping框架概述