天天看點

BMP灰階圖儲存程式

BOOL saveBmp(CString bmpName, unsigned char *imgBuf, long width, long height, int biBitCount, RGBQUAD *pColorTable)

{

//如果位圖資料指針為0,則沒有資料傳入,函數傳回

if(!imgBuf) return 0;

//顔色表大小,以位元組為機關,灰階圖像顔色表為1024位元組,彩×××像顔色表大小為0

int colorTablesize=0;

if(biBitCount==8)

colorTablesize=1024;

//待存儲圖像資料每行位元組數為4的倍數

long lineByte=(width * biBitCount/8+3)/4*4;

//以二進制寫的方式打開檔案

FILE *fp=fopen(bmpName,"wb");

if(fp==0)

return 0;

//申請位圖檔案頭結構變量,填寫檔案頭資訊

BITMAPFILEHEADER fileHead;

fileHead.bfType = 0x4D42;//bmp類型

//bfSize是圖像檔案4個組成部分之和

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize

+ lineByte*height;

fileHead.bfReserved1 = 0;

fileHead.bfReserved2 = 0;

//bfOffBits是圖像檔案前3個部分所需空間之和

fileHead.bfOffBits=54+colorTablesize;

//寫檔案頭進檔案

fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);

//申請位圖資訊頭結構變量,填寫資訊頭資訊

BITMAPINFOHEADER head;

head.biBitCount=biBitCount;

head.biClrImportant=0;

head.biClrUsed=0;

head.biCompression=0;

head.biHeight=height;

head.biPlanes=1;

head.biSize=40;

head.biSizeImage=lineByte*height;

head.bi;

head.biXPelsPerMeter=0;

head.biYPelsPerMeter=0;

//寫位圖資訊頭進記憶體

fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);

//如果灰階圖像,有顔色表,寫入檔案

fwrite(pColorTable, sizeof(RGBQUAD),256, fp);

//寫位圖資料進檔案

fwrite(imgBuf, height*lineByte, 1, fp);