總體結構:
位**件頭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 ...