**:
一、檔案格式
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.位...