align=center><B>BMP文件结构的探索<p></p></B></P>
align=center><a href="mailtwhatif@51.net" target="_blank" >WhatIf</A> 2004-9-10<p></p></P>( {) z* }6 F7 u/ z# V
>一、文件格式<p></p></P>& c4 z+ E! @ u" g+ u8 k6 p
>Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。<p></p></P>
>首先,整个bmp文件的内容可以分为3到4块。之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。具体稍候讨论。<p></p></P>8 t, W- s0 i& d3 `
>第一块是bmp的文件头用于描述整个bmp文件的情况。结构如下:<p></p></P><
RE>typedef struct tagBITMAPFILEHEADER { <p></p></PRE><
RE> WORD bfType; <p></p></PRE><
RE> DWORD bfSize; <p></p></PRE><
RE> WORD bfReserved1; <p></p></PRE><
RE> WORD bfReserved2; <p></p></PRE><
RE> DWORD bfOffBits; <p></p></PRE>
><FONT face="Times New Roman">} BITMAPFILEHEADER, *PBITMAPFILEHEADER;<p></p></FONT></P>
>这些信息相当有用,如果你想直接来解析<FONT face="Times New Roman">bmp</FONT>文件。第一个<FONT face="Times New Roman">bfType</FONT>用于表示文件类型,如果它是<FONT face="Times New Roman">bmp</FONT>文件,那么它这个位置的值一定是<FONT face="Times New Roman">”BM” </FONT>也就是<FONT face="Times New Roman">0x4D42</FONT>。第二个<FONT face="Times New Roman">bfSize</FONT>表示整个文件的字节数。第三第四个<FONT face="Times New Roman"> </FONT>则保留,目前无意义,最后一个相当重要,表示,位图的数据信息离文件头的偏移量,以字节为单位。<p></p></P>
>第二块是位图信息头,即<FONT face="Times New Roman">BITMAPINFOHEADER</FONT>,用于描述整个位图文件的情况。以下挑重要的数据进行解释<p></p></P>1 d! d5 z6 `0 i
>typedef struct tagBITMAPINFOHEADER{<p></p></P>! m7 j/ j a6 w) L- u
> DWORD biSize; //表示本结构的大小<p></p></P>& T$ m4 L5 r: ]' K2 h
> LONG biWidth; //位图的宽度<p></p></P>
> LONG biHeight; //位图的高度<p></p></P>
align=left>WORD biPlanes; //永远为1 ,由于没有用过所以 没做研究 附msdn解释<p></p></P>2 R& Z6 Y: ~. J
align=left>//<FONT face="Times New Roman">Specifies the number of planes for the target device. This value must be set to 1. <p></p></FONT></P>
> WORD biBitCount;//位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究<p></p></P>' F" i, q2 @( R
> DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释<p></p></P>, e* l) I) M0 c. s A5 m& S/ d
> DWORD biSizeImage; //表示位图数据区域的大小以字节为单位<p></p></P>4 x0 O- \5 i! O9 m# l. r: L E7 p
> LONG biXPelsPerMeter; <p></p></P>
> LONG biYPelsPerMeter; <p></p></P>! _4 l& r+ B9 _7 H/ r" W6 i. [
> DWORD biClrUsed; <p></p></P>8 k" L# j: }8 X; Z( P) H! L7 ?
> DWORD biClrImportant; <p></p></P>" J3 E7 _/ V! q
>} BITMAPINFOHEADER, *PBITMAPINFOHEADER;<p></p></P>9 |; l7 R+ i0 ^. }7 ?
> 第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板 ;16 与32位 位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。<p></p></P>* ^% @, x/ t/ [/ n0 S| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |