BMP 儲存個人理解

2021-09-08 06:23:15 字數 3572 閱讀 4520

總體結構:

位**件頭bitmapfileheader

位圖資訊頭bitmapinfoheader

調色盤palette

實際的點陣圖資料imagedate

《第一部分》位**件頭bitmapfileheader,此結構長度固定佔14位元組

typedef struct tagbitmapfileheader bitmapfileheader;

變數 大小(共14位元組)

作用bftype

2bytes

檔案型別說明,可取值:

bm - windows 3.1x,95,nt,...

ba - os/2 bitmap array

ci - os/2 color icon

cp - os/2 color pointer

ic - os/2 icon

pt - os/2 pointer

bfsize

4bytes

說明檔案大小,單位:byte

bfreserved1

2bytes

保留,必須設定為0

bfreserved2

2bytes

保留,必須設定為0

bfoffbits

4bytes

說明從檔案頭到實際影象資料之間的位元組偏移量。

因為位圖資訊頭和調色盤的長度不是固定的,有助於迅速定位位圖資料

《第二部分》為位圖資訊頭bitmapinfoheader,也是乙個結構,其定義如下:

typedef struct tagbitmapinfoheader bitmapinfoheader;

變數大小

作用bisize

4 bytes

bitmapinfoheader結構需要的位元組數

biwidth

4 bytes

影象寬度,畫素為單位

biheight

4 bytes

影象高度,畫素為單位

注:如果該值為正數,說明影象是倒向的;為負數,影象是正向的

大多數bmp影象是倒向的點陣圖;

biplanes

2 bytes

為目標裝置說明顏色平面數,值為1 

bibitcount

2 bytes

說明位元數/畫素,為1,4,8,16,24或32 

bicompression

4 bytes

說明影象資料壓縮型別,取值範圍:

0 bi_rgb 不壓縮

1 bi_rle8 8位元遊程編碼(rle),只用於8位位圖

2 bi_rle4 4位元遊程編碼(rle),只用於4位位圖

3 bi_bitfields 位元域,用於16/32位位圖

4 bi_jpeg jpeg點陣圖含jpeg影象(僅用於印表機)

5 bi_png png點陣圖含png影象(僅用於印表機)

bisizeimage

4 bytes

說明影象大小 bisizeimage=biwidth』 × biheight,單位位元組,當用bi_rgb時,可設定為0

bixpelspermeter

4 bytes

說明水平解析度(畫素/公尺),有符整數

biypelspermeter

4 bytes

說明垂直解析度(畫素/公尺),有符整數

biclrused

4 bytes

說明位圖實際使用的色彩表中的顏色索引,為0看後續說明

biclrimportant

4 bytes

說明對影象顯示有重要影響的顏色索引數目,為0表示都重要

《第三部分》為調色盤palette,當然,這裡是對那些需要調色盤的位**件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色盤的,bitmapinfoheader後直接是點陣圖資料。可以理解為biclrused引數不為0時,有調色盤。

調色盤實際上是乙個陣列,共有biclrused個元素(如果該值為零,則有2bibitcount個元素)。陣列中每個元素的型別是乙個rgbquad結構,佔4個位元組,其定義如下:

typedef struct tagrgbquad rgbquad;

比如索引值biclrused為64,即有64個調色盤,則總偏移量計算14bytes+40bytes+64*4bytes=310bytes

《第四部分》實際的圖象資料。

(1)對於用到調色盤的點陣圖,圖象資料就是該象素顏在調色盤中的索引值。即某一點只儲存乙個索引值,按照這個索引值在調色盤中查詢對應畫素作為它的畫素

(2)對於真彩色圖,圖象資料就是實際的r、g、b值。下面針對2色、16色、256色位圖和真彩色位圖分別介紹。每個畫素點都是按調色盤的格式儲存的,也可以理解為全是調色盤

對於2色位圖,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),所以乙個位元組可以表示8個象素。

對於16色位圖,用4位可以表示乙個象素的顏色,所以乙個位元組可以表示2個象素。

對於256色位圖,乙個位元組剛好可以表示1個象素。

要注意兩點:

(1)    每一行的位元組數必須是4的整倍數,如果不是,則需要補齊。這在前面介紹bisizeimage時已經提到了。

(2)    一般來說,.bmp檔案的資料從下到上,從左到右的。也就是說,從檔案中最先讀到的是圖象最下面一行的左邊第乙個象素,然後是左邊第二個象素……接下來是倒數第二行左邊第乙個象素,左邊第二個象素……依次類推 ,最後得到的是最上面一行的最右乙個象素。

《對齊》

windows預設的掃瞄的最小單位是4位元組,如果資料對齊滿足這個值能夠大幅提公升影象讀取速度。因此,bmp影象順應了這個要求,要求每行的資料的長度必須是4的倍數,如果不夠需要進行位元填充(以0填充)。填充後的每行的位元組數為:rowsize=4*ceil(bpp*width/32)

《其他情況》

上述主要是pc機上的位**件的構成,對於嵌入式平台,可能在調色盤資料段與pc機的不同。如在嵌入式平台上常見的16位r5g6b5點陣圖實際上採用的掩模的方式而不是索引的方式來表示影象。此時,在調色盤資料段共有四個部分,每個部分為四個位元組,實際表示的是彩色版規範。即:

第乙個部分是紅色分量的掩模

第二個部分是綠色分量的掩模

第三個部分是藍色分量的掩模

第四個部分是alpha分量的掩模(預設為0)

1111100000000000(二進位制),是藍紅分量的掩碼。 

0000011111100000(二進位制),是綠色分量的掩碼。 

0000000000011111(二進位制),是藍色分量的掩碼。

在每個畫素值的兩個位元組16位中,按從高到低取5、6、5位分別就是r、g、b分量值;把分量值r、g、b值分別左移操作3、2、3位就可以補齊每個分量為乙個位元組,再把這三個位元組按bgr組合,就可以轉換為24位標準bmp格式

posted @

2018-04-28 11:35

delh 閱讀(

...)

編輯收藏

BMP 儲存個人理解

總體結構 位 件頭bitmapfileheader 位圖資訊頭bitmapinfoheader 調色盤palette 實際的點陣圖資料imagedate 第一部分 位 件頭bitmapfileheader,此結構長度固定佔14位元組 typedef struct tagbitmapfileheade...

BMP之一 bmp格式解析 很容易理解

位 件 bitmap file,bmp 格式是windows採用的影象檔案儲存格式,在windows環境下執行的所有影象處理軟體都支援這種格 式。windows 3.0以前的bmp位 件格式與顯示裝置有關,因此把它稱為裝置相關位圖 device dependent bitmap,ddb 檔案格式。w...

vue的vuex儲存原理個人理解

第一步 先說下為什麼會 new store 它是怎麼來的 我們先來看段element ui裡面的table 原始碼,裡面會出現乙個小型封裝的vuex 這裡只放 片段,嘿嘿,便於理解 這段在watcher.js export default vue.extend 不可響應的 filtereddata ...