第壹部分為位圖文件頭BITMAPFILEHEADER,是壹個結構,其定義如下:
typedefstructtagBITMAPFILEHEADER{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
這個結構的長度是固定的,為14個字節(WORD為無符號16位整數,DWORD為無符號32位整數),各個域的說明如下:
bfType
指定文件類型,必須是0x424D,即字符串 "BM ",也就是說所有.bmp文件的頭兩個字節都是 "BM "
bfSize
指定文件大小,包括這14個字節
bfReserved1,bfReserved2
為保留字,不用考慮
bfOffBits
為從文件頭到實際的位圖數據的偏移字節數,即圖3中前三個部分的長度之和。
第二部分為位圖信息頭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;
這個結構的長度是固定的,為40個字節(WORD為無符號16位整數,DWORD無符
號32位整數,LONG為32位整數),各個域的說明如下:
biSize
指定這個結構的長度,為40
biWidth
指定圖象的寬度,單位是象素
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
指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount次方。
biClrImportant
指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。
第三部分為調色板(Palette),當然,這裏是對那些需要調色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色板的,BITMAPINFOHEADER後直接是位圖數據。
調色板實際上是壹個數組,***有biClrUsed個元素(如果該值為零,則有2的biBitCount次方個元素)。數組中每個元素的類型是壹個RGBQUAD結構,占4個字節,其定義如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue; //該顏色的藍色分量
BYTE rgbGreen; //該顏色的綠色分量
BYTE rgbRed; //該顏色的紅色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
第四部分就是實際的圖象數據了。對於用到調色板的位圖,圖象數據就是該像素顏在調色板中的索引值,對於真彩色圖,圖象數據就是實際的R,G,B值。下面就2色,16色,256色位圖和真彩色位圖分別介紹。
對於2色位圖,用1位就可以表示該像素的顏色(壹般0表示黑,1表示白),所以壹個字節可以表示8個像素。
對於16色位圖,用4位可以表示壹個像素的顏色,所以壹個字節可以表示2個像素。
對於256色位圖,壹個字節剛好可以表示1個像素。
對於真彩色圖,三個字節才能表示1個像素,哇噻,好費空間呀,沒辦法,誰叫妳想讓圖的顏色顯得更亮麗呢,有得必有失嘛。
要註意兩點:
1.每壹行的字節數必須是4的整倍數,如果不是,則需要補齊。這在前面介紹biSizeImage時已經提到了。
2.壹般來說,.BMP文件的數據從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面壹行的左邊第壹個像素,然後是左邊第二個像素…接下來是倒數第二行左邊第壹個像素,左邊第二個像素…依次類推,最後得到的是最上面壹行的最右壹個像素。
了解這些以後呢 可以通過以二進制的方式“rb”打開妳想讀取的png圖片
FILE *fp
if(!(fp=open(“filename”,rb)))
printf(“open file error”);
打開成功後就可以通過文件指針讀取文件內容了。