位圖(bmp)文件格式分析
作者:深藍(由博主分享)
一、什么是位圖
計算機能以位圖和矢量圖格式顯示圖像。
1、位圖(Bitmap):
圖像又稱點陣圖或光柵圖,它使用我們稱為像素(象素,Pixel)的一格一格的小點來描述圖像。計算機屏幕其實就是一張包含大量像素點的網格。當我們把位圖放大時,每一個像素小點看上去就像是一個個馬賽克色塊。
2、矢量圖(Vector)
使用直線和曲線來描述圖形,這些圖形的元素是一些點、線、矩形、多邊形、圓和弧線等等,它們都是通過數學公式計算獲得的。
位圖和矢量圖最簡單的區別就是:矢量圖可以無限放大,而且不會失真;而位圖則不能。
像Photoshop(PS)這樣主要用於處理位圖的軟件,我們稱之為圖像處理軟件;專門處理矢量圖的軟件,我們稱之為圖形設計軟件,例如Adobe Illustrator,CorelDRAW,Flash MX等。
二、BMP位圖文件
常見的圖像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。
BMP圖像文件(Bitmap-File)格式是Windows采用的圖像文件存儲格式,在Windows環境下運行的所有圖像處理軟件都支持這種格式。Windows 3.0以后的BMP文件都是指設備無關位圖(DIB,device-independent bitmap)。BMP位圖文件默認的文件擴展名是.BMP,有時它也會以.DIB或.RLE作擴展名。
注:本文采用lena.bmp(512×512)做例子:
1、BMP文件結構
BMP文件由4部分組成:
1. 位圖文件頭(bitmap-file header)
2. 位圖信息頭(bitmap-informationheader)
3. 顏色表(color table)
4. 顏色點陣數據(bits data)
24位真彩色位圖沒有顏色表,所以只有1、2、4這三部分。
用UltraEdit打開lena.bmp,可以看到這個文件的全部數據如下圖所示:
1、1位圖文件頭
位圖文件頭分4部分,共14字節:
名稱 |
占用空間 |
內容 |
實際數據 |
bfType |
2字節 |
標識,就是“BM”二字 |
BM |
bfSize |
4字節 |
整個BMP文件的大小 |
0x000C0036(786486) |
bfReserved1/2 |
4字節 |
保留字,沒用 |
0 |
bfOffBits |
4字節 |
偏移數,即 位圖文件頭+位圖信息頭+調色板 的大小 |
0x36(54) |
注意,Windows的數據是倒着念的,這是PC電腦的特色。如果一段數據為50 1A 25 3C,倒着念就是3C 25 1A50,即0x3C251A50。因此,如果bfSize的數據為36 00 0C 00,實際上就成了0x000C0036,也就是0xC0036。
1、2位圖信息頭
位圖信息頭共40字節:
名稱 |
占用空間 |
內容 |
實際數據 |
biSize |
4字節 |
位圖信息頭的大小,為40 |
0x28(40) |
biWidth |
4字節 |
位圖的寬度,單位是像素 |
0x200(512) |
biHeight |
4字節 |
位圖的高度,單位是像素 |
0x200(512) |
biPlanes |
2字節 |
固定值1 |
1 |
biBitCount |
2字節 |
每個像素的位數 1-黑白圖,4-16色,8-256色,24-真彩色 |
0x18(24) |
biCompression |
4字節 |
壓縮方式,BI_RGB(0)為不壓縮 |
0 |
biSizeImage |
4字節 |
位圖全部像素占用的字節數,BI_RGB時可設為0 |
0x0C |
biXPelsPerMeter |
4字節 |
水平分辨率(像素/米) |
0 |
biYPelsPerMeter |
4字節 |
垂直分辨率(像素/米) |
0 |
biClrUsed |
4字節 |
位圖使用的顏色數 如果為0,則顏色數為2的biBitCount次方 |
0 |
biClrImportant |
4字節 |
重要的顏色數,0代表所有顏色都重要 |
0 |
作為真彩色位圖,我們主要關心的是biWidth和biHeight這兩個數值,兩個數值告訴我們圖像的尺寸。biSize,biPlanes,biBitCount這幾個數值是固定的。想偷懶的話,其它的數值可以一律用0來填充。
1、3顏色表
24位真彩色位圖沒有顏色表。為了簡化,只討論24位真彩色位圖。
1、4顏色點陣數據
位圖全部的像素,是按照自下向上,自左向右的順序排列的。
RGB數據也是倒着念的,原始數據是按B、G、R的順序排列的。
三、Photoshop和Windows的BMP文件比較
Windows的BMP文件最后少了兩個0字節,沒有整體補位。bfSize(文件大小),biSizeImage(全部像素大小)也相應地減去2。
打開Photoshop,新建一個尺寸為2*3像素的文件:
放大圖片到最大(1600%),然后用鉛筆工具對每個像素都點一個不同顏色的點,如下圖所示:
儲存這個文件為BMP格式,文件名為“MyBmp.bmp”,在BMP選項中選擇Windows,24位:
你應該注意到圖中用黑色框起來的00 00了,在每行顏色的末尾添加的兩個0字節,是為了行補位。為什么要行補位呢?因為32位的Windows操作系統處理4個字節(32位)的速度比較快,所以BMP的每一行顏色占用的字節數規定為4的整數倍。MyBmp.bmp中一行顏色有兩個像素,共占用6字節,如果要補齊4*2=8字節,就要再加兩個0字節。
行補位的公式為:widthBytes = (width*biBitCount+31)/32*4
參數說明:
Width:位圖的實際寬度
biBitCount:每個像素的位數
1-黑白圖,4-16色,8-256色,24-真彩色
注:Phtoshop在文件的末尾還補充了兩個0字節,好像是要整體補位。不過我看過的BMP資料中都沒有提到還要整體補位的,其它軟件生成的BMP文件也沒有整體補位的,這看起來像是Adobe的獨創,不知道目的何在。
PS:文章最后注的內容將由下篇文章解釋