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>
>一、文件格式<p></p></P>6 v# L8 i8 c8 Q8 @/ f
>Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。<p></p></P>$ u: J7 D2 S& ?. v) L* X: ~& }
>首先,整个bmp文件的内容可以分为3到4块。之所以分为3到4块而不是固定的值,是因为,对于bmp来说可能存在调色板或者一些掩码。具体稍候讨论。<p></p></P>
>第一块是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>, K! J/ R5 W3 s
>第二块是位图信息头,即<FONT face="Times New Roman">BITMAPINFOHEADER</FONT>,用于描述整个位图文件的情况。以下挑重要的数据进行解释<p></p></P>- |0 w. O7 {; i$ D- n# P3 h. S% S* M+ R
>typedef struct tagBITMAPINFOHEADER{<p></p></P>1 W( k1 w, D, {$ b7 ?
> DWORD biSize; //表示本结构的大小<p></p></P>/ L5 B' b% E# [, x. B
> LONG biWidth; //位图的宽度<p></p></P>
> LONG biHeight; //位图的高度<p></p></P>
align=left>WORD biPlanes; //永远为1 ,由于没有用过所以 没做研究 附msdn解释<p></p></P>
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>9 x9 _3 ]$ q5 W. B/ [
> WORD biBitCount;//位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究<p></p></P>- @7 C9 D9 m" L& Z
> DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释<p></p></P>4 L6 R" ^. o3 o) b" I L! u
> DWORD biSizeImage; //表示位图数据区域的大小以字节为单位<p></p></P>8 i6 C+ S. `" g& H
> LONG biXPelsPerMeter; <p></p></P>
> LONG biYPelsPerMeter; <p></p></P>
> DWORD biClrUsed; <p></p></P>
> DWORD biClrImportant; <p></p></P>
>} BITMAPINFOHEADER, *PBITMAPINFOHEADER;<p></p></P>
> 第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板 ;16 与32位 位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。<p></p></P>| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |