24位bmp文件的读取&存储
我采用的方法是将图像文件读取,存储到一维数组中,以便后期的操作。
void checkFileExist(FILE * fpbmp)
{
//打开图片文件 按照二进制读取
if (fpbmp == NULL)
{
printf("当前打开的文件不存在!\n");
exit(1);
}
}
void readFile(FILE * pfInput, BITMAPFILEHEADER &fileHeader, BITMAPINFOHEADER &infoHeader)
{
//ReadtheBitmapfileheader;
fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pfInput);
//ReadtheBitmapinfoheader;
fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pfInput);
}
void checkInput(BITMAPINFOHEADER infoHeader, BITMAPFILEHEADER fileHeader)
{
if (fileHeader.bfType != BM)
{
printf("This file is not bmp file.!!!\n");
exit(1);
}
if (infoHeader.biBitCount != 24)
{
printf("当前打开的文件不是24位的bmp图,请检查后重启!\n");
printf("当前的位数为:%d\n", infoHeader.biBitCount);
exit(1);
}
else
{
printf("当前输入文件为:24位bmp图片\n");
}
}
void readWidthHeight(FILE *bfIn, BITMAPINFOHEADER infoHeader, int &original_width, int &original_height)
{
original_width = infoHeader.biWidth;
original_height = infoHeader.biHeight;
}
void bfWriteHead(FILE *bfIn, FILE *bfOut, BITMAPFILEHEADER &fileHeader)
{ //位图头文件
fseek(bfIn, 0L, SEEK_SET);
fseek(bfOut, 0L, SEEK_SET);
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, bfOut);
}
图像信息数据存储
void dataWrite(FILE *bfIn, FILE *bfOut,BITMAPINFOHEADER infoHeader,int original_width, int original_height)
{
fseek(bfIn, 54L, SEEK_SET);
int lineByte = WIDTHBYTES(original_width * infoHeader.biBitCount);
int l_width2 = WIDTHBYTES(original_height * infoHeader.biBitCount); //计算位图的实际宽度并确保它为4byte的倍数
unsigned char *data_original = (unsigned char*)malloc(sizeof(char)*original_height*lineByte);
if (data_original == NULL) {
printf("malloc failed\n");
}
memset(data_original, 0, original_height*lineByte);
fread(data_original, sizeof(char), lineByte*original_height, bfIn); //读取输入文件的数据信息
//……
//此处是具体的图像处理代码
free(data_original);
data_original = NULL;
}