關於bmp格式

2021-06-15 02:50:03 字數 2721 閱讀 8685

**:

bmp格式了解

先看一下bmp的頭檔案格式:

注意:以上的多位元組型別,如int32是以先高位後低位儲存的,如位檔案大小:0002-0005,int32型別,要按第5、4、3、2位元組順序組合,得到的整數才是正確的。

有了標頭檔案資訊後,我們就可以找到位圖資料。位圖資料是以4個位元組(32位,對應32位cpu的優化)為一組來處理的。

例1. 我們先來看簡單的只有黑白兩色的內部儲存方式(0:黑,1:白):

原始bmp圖(乙個方塊表示乙個象素)

bmp圖的二進位制**

紅框內表示位圖資料資訊,以4個位元組為一組(7*5畫素),位圖資料5個位元組,圖高5畫素,所以每行1個位元組,分別是:

7e 00 00 00 ;0111 1110 0000 0000 0000 0000 0000 0000

fe 00 00 00 ;1111 1110 0000 0000 0000 0000 0000 0000

7e 00 00 00 ;0111 1110 0000 0000 0000 0000 0000 0000

fe 00 00 00 ;1111 1110 0000 0000 0000 0000 0000 0000

54 00 00 00 ;0101 0100 0000 0000 0000 0000 0000 0000

對比一下原始的bmp圖,你就會發現,是以先橫向再縱向,先下後上的方式儲存。因為橫向的畫素只有7個,所以4個位元組(32位)只用到前面7位,後面用0表示。

例2. 看下24位的點陣圖,分別由rgb三原色組合,每個顏色用乙個位元組表示

24位bmp原圖

24位bmp圖二進位製碼

紅框內表示位圖資料資訊,以4個位元組為一組(2*3畫素),位圖資料24個位元組,圖高3畫素,所以每行8個位元組,分別是:

ff ff ff 00    ff 00 00 00  ; ff ff ff   00 ff 00   00 00  表示:白綠

00 ff 00 00   00 ff 00 00  ; 00 ff 00   00 00 ff  00 00   表示:綠紅

00 00 00 ff   00 00 00 00  ; 00 00 00   ff 00 00  00 00  表示:黑藍

因為24位是使用rgb三原色,每種原色都用乙個位元組。

觀察後,發現顏色是由bgr順序組,可能與字的儲存順序,先高位後低位有關。

進過多次試驗,發現bmp中資料的規律,不知道是否正確,但是確實是我這樣操作沒有發現問題。

就是說,每行開始的位置必須是4的倍數,不足的補充資料,這個資料無意義。什麼意思呢,就是說,比如上面的例二中,是2x3的,寬度是2,所以這三行資料是

第一行:ff  ff  ff 00     ff 00 aa aa ;    ff ff ff    00 ff 00       aa aa   表示:白綠

第二行:00  ff  00  00     00 ff aa aa ;    00 ff00      00 00 ff       aa aa   表示:綠紅

第三行:00  00  00  ff     00 00 aa aa ;    00 00 00      ff 00 00       aa aa   表示:黑藍

就拿第一行來說,

因為是2x3畫素,橫向2個畫素,而每個畫素有3個byte表示出顏色資訊,而下一行開始位置必須是4的倍數,所以這一行後面就要填充資料,這個資料沒有具體意義(或者有意義我沒有發現是什麼作用),也就是後面的aa aa這兩個位元組要填充,才能保證第二行開始位置是4的倍數。

也就是說,打個比方,比如第一行的位址是從0x0000開始讀,也就是第乙個ff位址是0x0000,那麼第二行的第乙個顏色資料00位址就應該保證是4的倍數,也就是0x0008,為什麼要這樣,這是因為和作業系統中的記憶體訪問有關,作業系統中記憶體訪問標準單位是int型(32位機),也即是4個位元組,那麼系統每次訪問首先是從4的倍數的位址開始讀取,這個學過微機原理的應該很清楚。

第一行:ff ff ff 00   ff 00 ff 00    00 aa aa aa ;   ff ff ff  00 ff 00   ff 00 00   aa aa aa 表示:白綠藍

第二行:00 ff 00 00    00 ff 00 00    ff aa aa aa ;   00 ff00    00 00 ff  00 00 ff   aa aa aa 表示:綠紅紅

第三行:00 00 00 ff    00 00 00 00    ff aa aa aa ;   00 00 00    ff 00 00  00 00 ff   aa aa aa 表示:黑藍紅

也就是說,為了保證第二行第乙個位置是4的倍數,必須要在第一行的末尾新增3個位元組(aa部分),因為是3*3=9,需要再補充3個那麼下一行的才是最近的乙個4的倍數12。

如果是4x3的呢,就不需要補充資料了,因為每一樣開始部分肯定是4的倍數,因為寬度是4個畫素,每個畫素由3個位元組標示,4x3肯定能被4整除的。那麼對於上面的這三行資料,後面的aa aa aa部分就不再無用了,而是標示aa aa aa真正代表的顏色值。

關於BMP格式的分析

bmp格式是一種比較簡單的儲存格式,bmp檔案分為四個部分,第一是檔案頭資訊塊佔14個位元組,第二部分是影象描述資訊塊,佔36位元組,第三部分是顏色表,佔4個位元組和但是我們目前用不到,第四部分是影象資料區,那就要看大小了。二 讀取的時候,因為它是按順序讀的,不重不漏,所以我用的是先新建兩個byte...

BMP格式詳解

列舉 c windows blue lace 16.bmp 位 件頭的格式 typedef structbitmapfileheader 檔案頭結構體,14位元組 typedef structbitmapinfoheader 位圖資訊頭,40位元組 bmp檔案詳解 2 2007 03 21 12 2...

bmp格式解析

寫這 時,出現的錯誤 1.忘了on wm paint 一直在介面上畫不出來 找了好久 2.正確寫法 byte pbits byte lpbase pbitmapfileheader bfoffbits 寫成了byte pbits pbitmapfileheader bfoffbits cpp inc...