1. 程式人生 > >24位bmp影象的資料讀取&儲存

24位bmp影象的資料讀取&儲存

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