BMP檔案結構的探索

2021-06-17 15:42:41 字數 2319 閱讀 3750

**:

一、檔案格式

bmp檔案是非常常用的位**件,無論是遊戲還是其他都被廣泛使用。針對bmp檔案的處理也有一堆現成的api進行呼叫,然而檔案內部究竟怎樣,如何自己來解析這樣的檔案呢?為了消除無聊,我用了幾天時間來研究了一下,同時作為學習筆記,進行記錄。

首先,整個bmp檔案的內容可以分為3到4塊。之所以分為3到4塊而不是固定的值,是因為,對於bmp來說可能存在調色盤或者一些掩碼。具體稍候討論。

第一塊是bmp的檔案頭用於描述整個bmp檔案的情況。結構如下:

typedef struct tagbitmapfileheader bitmapfileheader, *pbitmapfileheader;

這些資訊相當有用,如果你想直接來解析bmp檔案。第乙個bftype用於表示檔案型別,如果它是bmp檔案,那麼它這個位置的值一定是」bm」 也就是0x4d42。第二個bfsize表示整個檔案的位元組數。第三第四個 則保留,目前無意義,最後乙個相當重要,表示,點陣圖的資料資訊離檔案頭的偏移量,以位元組為單位。

第二塊是點陣圖資訊頭,即bitmapinfoheader,用於描述整個位**件的情況。以下挑重要的資料進行解釋

typedef struct tagbitmapinfoheader bitmapinfoheader, *pbitmapinfoheader;

第三塊就是調色盤資訊或者掩碼部分,如果是8位位圖 則存放調色盤 ;16 與32位位圖則存放rgb顏色的掩碼,這些掩碼以dword大小來存放。

最後一塊就是點陣圖的資料實體。

二、4位元組對其問題

關於資料讀取。bmp檔案有個重要特性,那就是對於資料區域而言,每行的資料它必須湊滿4位元組,如果沒有滿,則用冗餘的資料來補齊。這個特性直接影響到我們讀取位圖資料的方法,因為在我們看來(x,y)的資料應該在 y*width+x這樣的位置上 但是因為會有冗餘資訊那麼必須將width用width+該行的冗餘量來處理,而由於位**件有不同的位數,所以這樣的計算也不盡相同。

下面列出計算偏移量的一般公式。

首先將位圖資訊讀入乙個uchar 的buffer中 :

8位:int pitch;

if(width%4==0)else

file *fp=fopen(filename,"r");

if(fp==null)

bitmapfileheader fileheader;

bitmapinfo info;

fread(&fileheader,sizeof(fileheader),1,fp);

if(fileheader.bftype!=0x4d42)

fread(&info.bmiheader,sizeof(bitmapinfoheader),1,fp);

long width=info.bmiheader.biwidth;

long height=info.bmiheader.biheight;

uchar *buffer=new uchar[info.bmiheader.bisizeimage];

fseek(fp,fileheader.bfoffbits,0);

fread(buffer,info.bmiheader.bisizeimage,1,fp);

if(info.bmiheader.bibitcount==8)else

rgbquad quad[256];

fseek(fp,fileheader.bfoffbits-sizeof(rgbquad)*256,0);

fread(quad,sizeof(rgbquad)*256,1,fp);

if(height>0)

}}else}}

}else if(info.bmiheader.bibitcount==16)

}}else if(info.bmiheader.bicompression==bi_bitfields)

}}else if(rmask==0xf800)}}

}}else

}}else if(info.bmiheader.bicompression==bi_bitfields)

}}else if(rmask==0xf800)}}

}}//pdc->textout(100,200,"16點陣圖");

}else if(info.bmiheader.bibitcount==24)

}}else}}

//pdc->textout(100,200,"24點陣圖");

}else if(info.bmiheader.bibitcount==32)

}}else}}

//pdc->textout(100,200,"32點陣圖");

}delete buffer;

fclose(fp);}

BMP檔案結構的探索(轉貼)

bmp檔案結構的探索 貼 2008 06 09 17 46 59 一 檔案格式 bmp檔案是非常常用的位 件,無論是遊戲還是其他都被廣泛使用。針對bmp檔案的處理也有一堆現成的api進行呼叫,然而檔案內部究竟怎樣,如何自己來解析這樣的檔案呢?為了消除無聊,我用了幾天時間來研究了一下,同時作為學習筆記...

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...