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>& E6 a# q& q1 d6 k9 K2 t7 S
>一、文件格式<p></p></P>
>Bmp文件是非常常用的位图文件,无论是游戏还是其他都被广泛使用。针对bmp文件的处理也有一堆现成的api进行调用,然而文件内部究竟怎样,如何自己来解析这样的文件呢?为了消除无聊,我用了几天时间来研究了一下,同时作为学习笔记,进行记录。<p></p></P>
>首先,整个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>, p: Q3 g2 ^. Q. i+ ?
>第二块是位图信息头,即<FONT face="Times New Roman">BITMAPINFOHEADER</FONT>,用于描述整个位图文件的情况。以下挑重要的数据进行解释<p></p></P>- |) x# a) g0 B' C! l( I; r
>typedef struct tagBITMAPINFOHEADER{<p></p></P>
> DWORD biSize; //表示本结构的大小<p></p></P>
> LONG biWidth; //位图的宽度<p></p></P>
> LONG biHeight; //位图的高度<p></p></P>2 @9 N3 C0 X# X- {9 {1 \7 Y2 l
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>/ h l X2 C! d i& X, _% a
> WORD biBitCount;//位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究<p></p></P>6 Q, @& G: k) ]6 \
> DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释<p></p></P>% Y* h5 a3 W |4 a2 O
> DWORD biSizeImage; //表示位图数据区域的大小以字节为单位<p></p></P>
> LONG biXPelsPerMeter; <p></p></P>
> LONG biYPelsPerMeter; <p></p></P>
> DWORD biClrUsed; <p></p></P>' `1 S' c& O, Q1 f
> DWORD biClrImportant; <p></p></P>+ B. y8 K; J# a3 y8 b
>} BITMAPINFOHEADER, *PBITMAPINFOHEADER;<p></p></P>0 s. d' e' N/ P9 [1 K2 x( A1 l
> 第三块就是调色板信息或者掩码部分,如果是8位位图则存放调色板 ;16 与32位 位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。<p></p></P> K2 R4 f3 D# j" F- M" y5 T| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |