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