#include <stdio.h>
#include <windows.h>
int main() {
BITMAPFILEHEADER bmpFileHeader; //File Header
BITMAPINFOHEADER bmpInfoHeader; //Info Header
char *dataMatrix; //data matrix
FILE *inFile; //input RGB file
FILE *outFile; //output gray file
inFile = fopen("F:\\bmp\\hBmRight2.bmp", "r+b");
if(inFile == NULL) {
printf("Can not open file.\n");
exit(1);
}
fread(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, inFile);
fread(&bmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, inFile);
if(bmpInfoHeader.biBitCount!= 24) {
printf("Not a 24 bit bmp file\n");
printf("%d\n", bmpInfoHeader.biBitCount);
printf("%d %d\n", bmpInfoHeader.biWidth,bmpInfoHeader.biHeight);
//exit(1);
}
unsigned long size = bmpInfoHeader.biWidth * bmpInfoHeader.biHeight;
dataMatrix = new char[size * 4];
memset(dataMatrix, 0, size*4);
fread(dataMatrix, size*4, 1, inFile);
fclose(inFile);
for(unsigned long i = 0; i < size*4; i += 4)
{
//do sth here
char gray = (dataMatrix[i] + dataMatrix[i+1] + dataMatrix[i+2]) / 3;
dataMatrix[i] = gray;
dataMatrix[i+1] = gray;
dataMatrix[i+2] = gray;
}
//write output
outFile = fopen("F:\\bmp\\IMR.bmp", "w+b");
fwrite(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, outFile);
fwrite(&bmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, outFile);
fwrite(dataMatrix, size*4, 1, outFile);
fclose(outFile);
return 0;
}