位圖(bmp)文件格式分析


位圖(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:文章最后注的內容將由下篇文章解釋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM