具體數據舉例:
如某BMP文件開頭:
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
BMP文件可分爲四個部分:位圖文件頭、位圖信息頭、彩色板、圖像數據陣列,在上圖中已用*分隔。
一、圖像文件頭
1)1:(這裏的數字代表的是"字",即兩個字節,下同)圖像文件頭。424Dh=’BM’,表示是Windows支持的BMP格式。
2)2-3:整個文件大小。4690 0000,爲00009046h=36934。
3)4-5:保留,必須設置爲0。
4)6-7:從文件開始到位圖數據之間的偏移量。4600 0000,爲00000046h=70,上面的文件頭就是35字=70字節。
5)8-9:位圖圖信息頭長度。
6)10-11:位圖寬度,以像素爲單位。8000 0000,爲00000080h=128。
7)12-13:位圖高度,以像素爲單位。9000 0000,爲00000090h=144。
8)14:位圖的位面數,該值總是1。0100,爲0001h=1。
二、位圖信息頭
9)15:每個像素的位數。有1(單色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增強型真彩色)。1000爲0010h=16。
10)16-17:壓縮說明:有0(不壓縮),1(RLE 8,8位RLE壓縮),2(RLE 4,4位RLE壓縮,3(Bitfields,位域存放)。RLE簡單地說是採用像素數+像素值的方式進行壓縮。T408採用的是位域存放方式,用兩個字節表示一個像素,位域分配爲r5b6g5。圖中0300 0000爲00000003h=3。
11)18-19:用字節數表示的位圖數據的大小,該數必須是4的倍數,數值上等於位圖寬度×位圖高度×每個像素位數。0090 0000爲00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000爲0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000爲0000 0FA0h=4000。
14)24-25:位圖使用的顏色索引數。設爲0的話,則說明使用所有調色板項。
15)26-27:對圖象顯示有重要影響的顏色索引的數目。如果是0,表示都重要。
具體代碼C語言執行:(D 盤中有文件名爲1的bmp圖像)
#include <stdio.h>
#include <stdlib.h>
typedef struct tagBITMAPFILEHEADER
{
unsigned short int bfType; //位圖文件的類型,必須爲BM
unsigned long bfSize; //文件大小,以字節爲單位
unsigned short int bfReserverd1; //位圖文件保留字,必須爲0
unsigned short int bfReserverd2; //位圖文件保留字,必須爲0
unsigned long bfbfOffBits; //位圖文件頭到數據的偏移量,以字節爲單位
}BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
{
long biSize; //該結構大小,字節爲單位
long biWidth; //圖形寬度以象素爲單位
long biHeight; //圖形高度以象素爲單位
short int biPlanes; //目標設備的級別,必須爲1
short int biBitcount; //顏色深度,每個象素所需要的位數
short int biCompression; //位圖的壓縮類型
long biSizeImage; //位圖的大小,以字節爲單位
long biXPelsPermeter; //位圖水平分辨率,每米像素數
long biYPelsPermeter; //位圖垂直分辨率,每米像素數
long biClrUsed; //位圖實際使用的顏色表中的顏色數
long biClrImportant; //位圖顯示過程中重要的顏色數
}BITMAPINFOHEADER;
typedef struct
{
BITMAPFILEHEADER file; //文件信息區
BITMAPINFOHEADER info; //圖象信息區
}bmp;
bmp readbmpfile(void); //函數聲明
int main(void)
{
bmp m; //定義一個結構變量
m=readbmpfile(); //讀取一個位圖
getchar();
return 0;
}
bmp readbmpfile(void)
{ bmp m; //定義一個位圖結構
FILE *fp;
if((fp=fopen( "d:\\1.bmp", "r"))==NULL)
{ printf( "can't open the bmp imgae.\n ");
exit(0);
}
else
{
fread(&m.file.bfType,sizeof(char),1,fp);
printf("類型爲%c",m.file.bfType);
fread(&m.file.bfType,sizeof(char),1,fp);
printf("%c\n",m.file.bfType);
fread(&m.file.bfSize,sizeof(long),1,fp);
printf("文件長度爲%d\n",m.file.bfSize);
fread(&m.file.bfReserverd1,sizeof(short int),1,fp);
printf("保留字1爲%d\n",m.file.bfReserverd1);
fread(&m.file.bfReserverd2,sizeof(short int),1,fp);
printf("保留字2爲%d\n",m.file.bfReserverd2);
fread(&m.file.bfbfOffBits,sizeof(long),1,fp);
printf("偏移量爲%d\n",m.file.bfbfOffBits);
fread(&m.info.biSize,sizeof(long),1,fp);
printf("此結構大小爲%d\n",m.info.biSize);
fread(&m.info.biWidth,sizeof(long),1,fp);
printf("位圖的寬度爲%d\n",m.info.biWidth);
fread(&m.info.biHeight,sizeof(long),1,fp);
printf("位圖的高度爲%d\n",m.info.biHeight);
fread(&m.info.biPlanes,sizeof(short),1,fp);
printf("目標設備位圖數%d\n",m.info.biPlanes);
fread(&m.info.biBitcount,sizeof(short),1,fp);
printf("顏色深度爲%d\n",m.info.biBitcount);
fread(&m.info.biCompression,sizeof(long),1,fp);
printf("位圖壓縮類型%d\n",m.info.biCompression);
fread(&m.info.biSizeImage,sizeof(long),1,fp);
printf("位圖大小%d\n",m.info.biSizeImage);
fread(&m.info.biXPelsPermeter,sizeof(long),1,fp);
printf("位圖水平分辨率爲%d\n",m.info.biXPelsPermeter);
fread(&m.info.biYPelsPermeter,sizeof(long),1,fp);
printf("位圖垂直分辨率爲%d\n",m.info.biYPelsPermeter);
fread(&m.info.biClrUsed,sizeof(long),1,fp);
printf("位圖實際使用顏色數%d\n",m.info.biClrUsed);
fread(&m.info.biClrImportant,sizeof(long),1,fp);
printf("位圖顯示中比較重要顏色數%d\n",m.info.biClrImportant);
}
return m;
}
結果執行如下: