LCD補充(轉) —— windows下讀取BMP圖片

第一部分

爲位圖文件頭BITMAPFILEHEADER,是一個結構,其定義以下:html

  
1 typedef struct tagBITMAPFILEHEADER { 2 WORD bfType; 3 DWORD bfSize; 4 WORD bfReserved1; 5 WORD bfReserved2; 6 DWORD bfOffBits; 7 } BITMAPFILEHEADER;

這個結構的長度是固定的,爲14個字節(WORD爲無符號16位整數,DWORD爲無符號32位整數),各個域的說明以下:數組

bfType:指定文件類型,必須是0x424D,即字符串「BM」,也就是說全部.bmp文件的頭兩個字節都是「BM」。spa

bfSize:指定文件大小,包括這14個字節。code

bfReserved1,bfReserved2 :爲保留字,不用考慮orm

bfOffBits:爲從文件頭到實際的位圖數據的偏移字節數,即圖1.3中前三個部分的長度之和。htm

第二部分

爲位圖信息頭BITMAPINFOHEADER,也是一個結構,其定義以下:blog

  
1 typedef struct tagBITMAPINFOHEADER{ 2 DWORD biSize; 3 LONG biWidth; 4 LONG biHeight; 5 WORD biPlanes; 6 WORD biBitCount 7 DWORD biCompression; 8 DWORD biSizeImage; 9 LONG biXPelsPerMeter; 10 LONG biYPelsPerMeter; 11 DWORD biClrUsed; 12 DWORD biClrImportant; 13 } BITMAPINFOHEADER;

這個結構的長度是固定的,爲40個字節(LONG爲32位整數),各個域的說明以下:索引

biSize:指定這個結構的長度,爲40。ip

biWidth:指定圖象的寬度,單位是象素。ci

biHeight:指定圖象的高度,單位是象素。

biPlanes:必須是1,不用考慮。

biBitCount:指定表示顏色時要用到的位數,經常使用的值爲1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,這裏就不作討論了)。

biCompression:指定位圖是否壓縮,有效的值爲BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,Windows位圖能夠採用RLE4,和RLE8的壓縮格式,但用的很少。咱們從此所討論的只有第一種不壓縮的狀況,即biCompression爲BI_RGB的狀況。

biSizeImage:指定實際的位圖數據佔用的字節數,其實也能夠從如下的公式中計算出來:

biSizeImage=biWidth’ × biHeight

要注意的是:上述公式中的biWidth’必須是4的整倍數(因此不是biWidth,而是biWidth’,表示大於或等於biWidth的,最接近4的整倍數。舉個例子,若是biWidth=240,則biWidth’=240;若是biWidth=241,biWidth’=244)。若是biCompression爲BI_RGB,則該項可能爲零

biXPelsPerMeter:指定目標設備的水平分辨率,單位是每米的象素個數

biYPelsPerMeter:指定目標設備的垂直分辨率,單位同上。

biClrUsed:指定本圖象實際用到的顏色數,若是該值爲零,則用到的顏色數爲2biBitCount。

biClrImportant:指定本圖象中重要的顏色數,若是該值爲零,則認爲全部的顏色都是重要的。

第三部分

爲調色板Palette,固然,這裏是對那些須要調色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經講過,是不須要調色板的,BITMAPINFOHEADER後直接是位圖數據。

調色板其實是一個數組,共有biClrUsed個元素(若是該值爲零,則有2^biBitCount個元素)。數組中每一個元素的類型是一個RGBQUAD結構,佔4個字節,其定義以下:

  
1 typedef struct tagRGBQUAD { 2 BYTE rgbBlue; // 該顏色的藍色份量 3 BYTE rgbGreen; // 該顏色的綠色份量 4 BYTE rgbRed; // 該顏色的紅色份量 5 BYTE rgbReserved; // 保留值 6 } RGBQUAD;

第四部分

就是實際的圖象數據了。對於用到調色板的位圖,圖象數據就是該象素顏在調色板中的索引值。對於真彩色圖,圖象數據就是實際的R、G、B值。下面針對2色、16色、256色位圖和真彩色位圖分別介紹。

對於2色位圖,用1位就能夠表示該象素的顏色(通常0表示黑,1表示白),因此一個字節能夠表示8個象素。

對於16色位圖,用4位能夠表示一個象素的顏色,因此一個字節能夠表示2個象素。

對於256色位圖,一個字節恰好能夠表示1個象素。

對於真彩色圖,三個字節才能表示1個象素

要注意兩點:

(1)每一行的字節數必須是4的整倍數,若是不是,則須要補齊。這在前面介紹biSizeImage時已經提到了。

(2)通常來講,.bMP文件的數據從下到上,從左到右的。也就是說,從文件中最早讀到的是圖象最下面一行的左邊第一個象素,而後是左邊第二個象素……接下來是倒數第二行左邊第一個象素,左邊第二個象素……依次類推 ,最後獲得的是最上面一行的最右一個象素。

來源: <http://www.cnblogs.com/UnGeek/archive/2012/10/10/2718047.html>

相關文章
相關標籤/搜索