Bmp格式詳解

Bmp格式詳解

更新請參見博客地址http://hi.baidu.com/%C1%B5%D0%C4hjb/blog/item/e3f29bd1ee9d651ca08bb742.html

 

 

UltraEdit打開一個24bitbmp(對於一些頭信息計算上需要注意的是,x86體系結構下是小端模式,即數據低位在低地址),其中的二進制數據由文件頭位圖信息頭顏色信息(或稱爲色表、調色板等)圖形數據四部分組成。

前三個部分後續轉載文中會有詳細敘述,對於圖形數據,有以下幾個要點需要了解:

(1)Windows規定圖像文件中一個掃描行所佔的字節數必須是4的倍數(即以字爲單位),不足的以0填充。比如7*7像素的圖像,每一行原始是7*3=21字節數據,由於非4字節對齊故會補三字節的0x00數據,使得每行爲24字節數據。

(2)所有的bmp數據掃描行是上下顛倒的。也就是說一幅圖片先繪製底部的像素,再繪製頂部的像素,所以這些bmp數據所表示的像素點就是從圖片的左下角開始,一直表示到圖片的右上角。

(3)Bmp數據的存儲格式爲BGR順次存儲。大家不能習慣性地認爲是RGB順次存儲。

 

 

以下部分內容轉載自http://apps.hi.baidu.com/share/detail/6982516

BMP文件中文稱爲位圖文件,實際上取自Bit Map的縮寫。位圖分爲四種:
線畫稿:只有黑白兩種顏色,所以像素用0,1表示。
灰度圖象:在灰度圖像中,像素灰度用8bit表示,像素灰度級用8bit表示,所以每個像素都是介於黑色和白色之間的256種的灰度的一種。
索引圖像:在真彩色出現之前,由於技術上的原因,計算機在處理時並沒有達到每像素24位的真彩色水平,爲此人們創造了索引顏色。索引顏色通常也被稱爲映射顏色,在這種模式下,顏色都是預先定義的,並且可供選用的一組顏色也有限,索引顏色的圖像最多隻能顯示256種顏色。一幅索引顏色圖像在圖像文件裏定義,當打開該文件時,構成該圖像具體顏色的索引值就被讀入程序裏,然後根據索引值找到最終的顏色。
真彩色圖像:在真彩色圖像中,每一個像素由紅、綠和藍三個字節組成,每個字節爲8bit,表示0~255之間的不同的亮度值,這三個字節組合可以產生1670萬種不同的顏色。

1.BMP文件組成
BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成
2. BMP文件頭
BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。

其結構定義如下:

typedef struct tagBITMAPFILEHEADER
{
       WORD bfType; //
位圖文件的類型,必須爲BM
       DWORD bfSize; //
位圖文件的大小,以字節爲單位
       WORD bfReserved1; // 位圖文件保留字,必須爲0
       WORD bfReserved2; //
位圖文件保留字,必須爲0
       DWORD bfOffBits; //
位圖數據的起始位置,以相對於位圖
       // 文件頭的偏移量表示,以字節爲單位
} BITMAPFILEHEADER;

3.
位圖信息頭

BMP位圖信息頭數據用於說明位圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
       DWORD biSize;    //
本結構所佔用字節數
       LONG biWidth;     // 位圖的寬度,以像素爲單位
       LONG biHeight;    // 位圖的高度,以像素爲單位
       WORD biPlanes;   // 目標設備的級別,必須爲1
       WORD biBitCount //
每個像素所需的位數,必須是1(雙色),
                                   // 4(16
)8(256)24(真彩色)之一
       DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮),
                                   // 1(BI_RLE8
壓縮類型)2(BI_RLE4壓縮類型)之一
       DWORD biSizeImage; // 位圖的大小,以字節爲單位
       LONG biXPelsPerMeter;// 位圖水平分辨率,每米像素數
       LONG biYPelsPerMeter;// 位圖垂直分辨率,每米像素數
       DWORD biClrUsed;      // 位圖實際使用的顏色表中的顏色數
       DWORD biClrImportant;// 位圖顯示過程中重要的顏色數
} BITMAPINFOHEADER;

4.
顏色表
    是單色、16色、256色圖像文件所特有的,相對應的調色板大小是2、16、和256,調色板以4字節爲單位,每4個字節存放一個顏色值。圖像的數據是指向調色板的索引。

    顏色表用於說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:


typedef struct tagRGBQUAD {
       BYTE rgbBlue;      //
藍色的亮度(值範圍爲0-255)
       BYTE rgbGreen;   //
綠色的亮度(值範圍爲0-255)
       BYTE rgbRed;      //
紅色的亮度(值範圍爲0-255)
       BYTE rgbReserved;//
保留,必須爲0
} RGBQUAD;
顏色表中RGBQUAD結構數據的個數有biBitCount來確定:
biBitCount=1,4,8時,分別有2,16,256個表項;
biBitCount=24時,沒有顏色表項。
位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下:
typedef struct tagBITMAPINFO {
       BITMAPINFOHEADER bmiHeader; //
位圖信息頭
       RGBQUAD bmiColors[1];                 // 顏色表
} BITMAPINFO;

5.
位圖數據
位圖數據記錄了位圖的每一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。位圖的一個像素值所佔的字節數:

biBitCount=1時,8個像素佔1個字節;
biBitCount=4時,2個像素佔1個字節;
biBitCount=8時,1個像素佔1個字節;
biBitCount=24,1個像素佔3個字節;
Windows
規定一個掃描行所佔的字節數必須是4的倍數(即以long爲單位),不足的以0填充,一個掃描行所佔的字節數計算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;
//
一個掃描行所佔的字節數
DataSizePerLine= DataSizePerLine/4*4; // 字節數必須是4的倍數
位圖數據的大小(不壓縮情況下):
DataSize= DataSizePerLine* biHeight;

 

 

 

 

 

 

以下轉載自csdn http://blog.csdn.net/ezhong0812/article/details/6660685

PS(或畫圖工具)新建了10*10像素的24bmp圖片,用UE打開仔細瞧瞧

-------------------------------------------------------------以下文件頭

42 4D              BM一直不變

78 01 00 00    圖片大小

00 00               保留爲0

00 00               保留爲0

36 00 00 00   偏移  非索引圖是54 、索引圖不固定

位圖文件頭共14個字節(0計數)

 

WORD bfType(01字節):

42 4d代表BM42-B,4d-M

存儲順序是424d,用雙字節單位讀取的時候,先讀取42放在低字節,再讀取4d放在高字節,程序中應該判斷雙字節單元中存儲的是否是0x4d42

 

 if(header.bfType == 0x4d42) {}

DWORD bfSize(2345字節)

78 01 00 00    0x178(十進制376)字節,右鍵屬性中顯示的整個圖片文件的大小

WORD bfReserved1(67字節)

00 00 保留字節爲0

WORD bfReserved2(89字節)

00 00 保留字節爲0

DWORD bfOffBits(10111213字節)

36 00 00 00   0x36(十進制54),位圖數據的起始位置是第54字節

(24位圖,位圖文件頭(BITMAPFILEHEADER14字節)和位圖信息頭(BITMAPINFOHEADER40字節)之後就是位圖數據,沒有調色板)

-----------------------------------------------------------以下信息頭

 

28 00 00 00    一直不變

0A 00 00 00   

0A 00 00 00   

01 00         一直不變

18 00         多少位圖

00 00 00 00    無壓縮一直不變

42 01 00 00    像素數據大小

20 2E 00 00   水平分辨率

20 2E 00 00   垂直分辨率

00 00 00 00    後兩個雙字用在索引圖

00 00 00 00

位圖信息頭,共40個字節

 

DWORD biSize(14151617字節)

28 00 00 00  0x28(十進制40),位圖信息頭佔40字節

 

LONG  biWidth(18192021字節)

0a 00 00 00  0x0a(十進制10),位圖的寬度是10像素

 

LONG  biHeight(22232425字節)

0a 00 00 00  0x0a(十進制10),位圖的高度是10像素

 

WORD  biPlanes(2627字節)

01 00        0x01(十進制1),目標設備級別,爲1

 

WORD  biBitCount(2829字節)

18 00       0x18(十進制24) 圖標是24位圖

 

DWORD biCompression(30313233字節)

00 00 00 00  即十進制0 ,表示圖片未壓縮

 

DWORD biSizeImage(34353637字節)

42 01 00 00 0x00000142(十進制322) 圖片中像素數據的大小(整個圖片的大小減去位圖

文件頭和位圖信息頭的大小,376-14-40=322)

 

LONG biXPelsPerMeter(38394041字節)

20 2E 00 00 0x00002E20(十進制11808) 位圖水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(42434445字節)

20 2E 00 00 0x00002E20(十進制11808) 位圖垂直分辨率,每米11808像素

 

DWORD biClrUsed(46474849字節)

00 00 00 00 0,位圖使用顏色表中的顏色數是0

DWORD biClrImportant(50515253字節)

00 00 00 00 0 位圖顯示過程中重要的顏色數是0

 

-----------------------------------------------------------------------------------------------------補一個1610*10bmp文件頭、信息頭

----------------------------------以下文件頭

42 4D

00 01 00 00

00 00

00 00

36 00 00 00

位圖文件頭共14個字節(0計數)

 

WORD bfType(01字節):

42 4d代表BM42-B,4d-M

存儲順序是424d,存儲的是低字節在前,高字節在後,所以程序中判斷是否爲BM需要反着寫if(header.bfType == 0x4d42) {}

 

DWORD bfSize(2345字節)

00 01 00 00    0x100(十進制256)字節,右鍵屬性中顯示的整個圖片文件的大小

 

WORD bfReserved1(67字節)

00 00 保留字節爲0

 

WORD bfReserved2(89字節)

00 00 保留字節爲0

 

DWORD bfOffBits(10111213字節)

36 00 00 00   0x36(十進制54),位圖數據的起始位置是第54字節

(16位圖,文件信息頭(14字節)和位圖信息頭(40字節)之後就是位圖數據,沒有調色板)

-----------------------------------------------------------以下信息頭

28 00 00 00

0A 00 00 00

0A 00 00 00

01 00

10 00

00 00 00 00

CA 00 00 00

20 2E 00 00

20 2E 00 00

00 00 00 00

00 00 00 00

位圖信息頭,共40個字節

 

 

DWORD biSize(14151617字節)

28 00 00 00  0x28(十進制40),位圖信息頭佔40字節

 

LONG  biWidth(18192021字節)

0A 00 00 00  0x0a(十進制10),位圖的寬度是10像素

 

LONG  biHeight(22232425字節)

0A 00 00 00  0x0a(十進制10),位圖的高度是10像素

 

WORD  biPlanes(2627字節)

01 00        0x01(十進制1),目標設備級別,爲1

 

WORD  biBitCount(2829字節)

10 00       0x0010(十進制16) 圖標是16位圖

 

DWORD biCompression(30313233字節)

00 00 00 00  即十進制0 ,表示圖片未壓縮

 

DWORD biSizeImage(34353637字節)

CA 00 00 00 0x000000CA(十進制202) 圖片中像素數據的大小(整個圖片的大小減去位圖

 

文件頭和位圖信息頭的大小,256-14-40=202)

 

LONG biXPelsPerMeter(38394041字節)

20 2E 00 00 0x00002E20(十進制11808) 位圖水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(42434445字節)

20 2E 00 00 0x00002E20(十進制11808) 位圖垂直分辨率,每米11808像素

 

DWORD biClrUsed(46474849字節)

00 00 00 00 0,位圖使用顏色表中的顏色數是0

DWORD biClrImportant(50515253字節)

00 00 00 00 0 位圖顯示過程中重要的顏色數是0

 

------------------------------------------------------------------------------------------------再補一個8位的10*10像素的bmp圖文件頭、信息頭二進制

-------------------------------------文件頭

42 4D

D8 00 00 00

00 00

00 00

5E 00 00 00

位圖文件頭共14個字節(0計數)

WORD bfType(01字節):

42 4d代表BM42-B,4d-M

存儲順序是424d,存儲的是低字節在前,高字節在後,所以程序中判斷是否爲BM需要反着寫if(header.bfType == 0x4d42) {}

 

DWORD bfSize(2345字節)

D8 00 00 00     0xD8(十進制216)字節,右鍵屬性中顯示的整個圖片文件的大小

 

WORD bfReserved1(67字節)

00 00 保留字節爲0

WORD bfReserved2(89字節)

00 00 保留字節爲0

DWORD bfOffBits(10111213字節)

5E 00 00 00   0x5E(十進制94),位圖數據的起始位置是第94字節

(8位圖,文件信息頭(14字節)和位圖信息頭(40字節)之後就是調色板(40字節))

(後面知道使用顏色表的顏色數是10,每個4字節,10*4=40=調色板大小)

----------------------------------------------------------- 以下信息頭

28 00 00 00

0A 00 00 00

0A 00 00 00

01 00

08 00

00 00 00 00

7A 00 00 00

20 2E 00 00

20 2E 00 00

0A 00 00 00

0A 00 00 00

位圖信息頭,共40個字節

 

DWORD biSize(14151617字節)

28 00 00 00  0x28(十進制40),位圖信息頭佔40字節

 

LONG  biWidth(18192021字節)

0A 00 00 00  0x0a(十進制10),位圖的寬度是10像素

 

LONG  biHeight(22232425字節)

0A 00 00 00  0x0a(十進制10),位圖的高度是10像素

 

WORD  biPlanes(2627字節)

01 00        0x01(十進制1),目標設備級別,爲1

 

WORD  biBitCount(2829字節)

08 00       0x0008(十進制8) 圖標是8位圖

 

 

DWORD biCompression(30,31,32,33字节)

00 00 00 00  即十进制0 ,表示图片未压缩

 

DWORD biSizeImage(第34、35、36、37字节)

7A 00 00 00 即0x0000007A(十进制122) 图片中像素数据的大小(整个图片的大小减去位图

 

文件头和位图信息头和调色板(10*4)的大小,216-14-40-40=122)

 

LONG biXPelsPerMeter(第38、39、40、41字节)

20 2E 00 00 即0x00002E20(十进制11808) 位图水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(第42、43、44、45字节)

20 2E 00 00 即0x00002E20(十进制11808) 位图垂直分辨率,每米11808像素

 

DWORD biClrUsed(第46、47、48、49字节)

0A 00 00 00   即0x0A(十进制10),位图使用颜色表中的颜色数是10,

DWORD biClrImportant(第50、51、52、53字节)

0A 00 00 00   即0x0A(十进制10),位图显示过程中重要的颜色数是10

 

---------------------------------------之后是40字节调色板

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章