1. 程式人生 > >BMP 儲存個人理解

BMP 儲存個人理解

垂直 倒數 let 打印機 文件的 文件大小 field time rom

總體結構: 位圖文件頭BITMAPFILEHEADER 位圖信息頭BITMAPINFOHEADER 調色板Palette 實際的位圖數據ImageDate

<第一部分>位圖文件頭BITMAPFILEHEADER,此結構長度固定占14字節

typedef struct tagBITMAPFILEHEADER {

  WORD bfType;

  DWORD bfSize;

  WORD bfReserved1;

  WORD bfReserved2;

  DWORD bfOffBits;

} 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{

  DWORD biSize;

  LONG biWidth;

  LONG biHeight;

  WORD biPlanes;

  WORD biBitCount

  DWORD biCompression;

  DWORD biSizeImage;

  LONG biXPelsPerMeter;

  LONG biYPelsPerMeter;

  DWORD biClrUsed;

  DWORD biClrImportant;

} 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 {

BYTE rgbBlue; //該顏色的藍色分量

BYTE rgbGreen; //該顏色的綠色分量

BYTE rgbRed; //該顏色的紅色分量

BYTE rgbReserved; //保留值

} 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格式

BMP 儲存個人理解