c++讀取bmp圖片詳解
阿新 • • 發佈:2019-01-05
先介紹幾個會用到的函式。
1、FILE * fopen(const char * path,const char * mode);
path是字串型別的bmp圖片路徑;mode讀取方式,等下回用到"rb",讀寫開啟一個二進位制檔案,允許讀寫資料,檔案必須存在。
2、int fseek(FILE *stream, long offset, int fromwhere);
函式設定檔案指標stream的位置,stream指向以fromwhere為基準,偏移offset個位元組的位置。
3、size_t fread
( void *buffer, size_t size, size_t count , FILE *stream)
;
從stream中讀取count個單位大小為size個位元組,存在buffer中。
在貼個程式碼:
#include <iostream> #include <windows.h> #include <stdio.h> using namespace std; int bmpwidth,bmpheight,linebyte; unsigned char *pBmpBuf; //儲存影象資料 bool readBmp(char *bmpName) { FILE *fp; if( (fp = fopen(bmpName,"rb")) == NULL) //以二進位制的方式開啟檔案 { cout<<"The file "<<bmpName<<"was not opened"<<endl; return FALSE; } if(fseek(fp,sizeof(BITMAPFILEHEADER),0)) //跳過BITMAPFILEHEADE { cout<<"跳轉失敗"<<endl; return FALSE; } BITMAPINFOHEADER infoHead; fread(&infoHead,sizeof(BITMAPINFOHEADER),1,fp); //從fp中讀取BITMAPINFOHEADER資訊到infoHead中,同時fp的指標移動 bmpwidth = infoHead.biWidth; bmpheight = infoHead.biHeight; linebyte = (bmpwidth*24/8+3)/4*4; //計算每行的位元組數,24:該圖片是24位的bmp圖,3:確保不丟失畫素 //cout<<bmpwidth<<" "<<bmpheight<<endl; pBmpBuf = new unsigned char[linebyte*bmpheight]; fread(pBmpBuf,sizeof(char),linebyte*bmpheight,fp); fclose(fp); //關閉檔案 return TRUE; } void solve() { char readFileName[] = "nv.BMP"; if(FALSE == readBmp(readFileName)) cout<<"readfile error!"<<endl; } int main() { solve(); return 0; }