1. 程式人生 > >c++讀取bmp圖片詳解

c++讀取bmp圖片詳解

先介紹幾個會用到的函式。

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