24位bmp影象的資料讀取&儲存
阿新 • • 發佈:2018-11-14
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; }