BMP頭文件格式以及C語言讀取頭文件(二)

具體數據舉例:
如某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; 
}
結果執行如下:‍‍

發佈了5 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章