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;
}