📄 bmp文件格式分析.htm
字号:
<TD width=43><FONT size=+0>根据BMP版本的不同而不同</FONT></TD>
<TD width=80><FONT size=+0>Palette</FONT></TD>
<TD width=58><FONT size=+0>N * 4 byte</FONT></TD>
<TD width=287><FONT size=+0>调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:</FONT> <!--msthemelist-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0><!--msthemelist-->
<TBODY>
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">1字节用于蓝色分量<!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">1字节用于绿色分量<!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">1字节用于红色分量<!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">1字节用于填充符(设置为0)<!--msthemelist--></TD></TR><!--msthemelist--></TBODY></TABLE></TD></TR>
<TR>
<TD width=27><FONT size=+0>图象数据</FONT></TD>
<TD width=43><FONT size=+0>根据BMP版本及调色板尺寸的不同而不同</FONT></TD>
<TD width=80><FONT size=+0>Bitmap Data</FONT></TD>
<TD width=58><FONT size=+0>xxx bytes</FONT></TD>
<TD width=287><FONT
size=+0>该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。</FONT></TD></TR></TBODY></TABLE></CENTER></DIV><BR><BR><BR><BR>
<BLOCKQUOTE><B><FONT color=#ff0000>
<P align=center>构件详解</FONT></B></P></BLOCKQUOTE><FONT color=#7f007f size=+0><B>
<P>1. 位图文件头</B></FONT> </P>
<P><FONT size=+0>位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows
3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:</FONT> </P>
<P><FONT size=+0>typedef struct tagBITMAPFILEHEADER { /* bmfh */</FONT>
<BLOCKQUOTE><FONT size=+0>UINT bfType;</FONT><BR><FONT size=+0>DWORD
bfSize;</FONT> <BR><FONT size=+0>UINT bfReserved1;</FONT> <BR><FONT
size=+0>UINT bfReserved2;</FONT> <BR><FONT size=+0>DWORD
bfOffBits;</FONT><BR></BLOCKQUOTE><FONT size=+0>} BITMAPFILEHEADER;</FONT>
<P></P>
<P><FONT size=+0>其中:</FONT> <BR> </P>
<TABLE cellSpacing=0 width=557 border=0>
<TBODY>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bfType</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>说明文件的类型.(该值必需是0x4D42,也就是字符'BM'。我们不需要判断OS/2的位图标识,这么做现在来看似乎已经没有什么意义了,而且如果要支持OS/2的位图,程序将变得很繁琐。所以,在此只建议你检察'BM'标识) </FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bfSize</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>说明文件的大小,用字节为单位</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bfReserved1</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>保留,必须设置为0</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bfReserved2</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>保留,必须设置为0</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bfOffBits</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。</FONT></P></BLOCKQUOTE></TD></TR></TBODY></TABLE>
<P><FONT color=#7f007f size=+0><B>2. 位图信息头</B></FONT> </P>
<P><FONT size=+0>位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information
header)和彩色表(color
table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:</FONT> </P>
<P><FONT size=+0>typedef struct tagBITMAPINFO { /* bmi */</FONT>
<BLOCKQUOTE><FONT size=+0>BITMAPINFOHEADER bmiHeader;</FONT><BR><FONT
size=+0>RGBQUAD bmiColors[1];</FONT><BR></BLOCKQUOTE><FONT size=+0>}
BITMAPINFO;</FONT>
<P></P>
<P><FONT size=+0>其中:</FONT> <BR> </P>
<TABLE cellSpacing=0 width=557 border=0>
<TBODY>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bmiHeader</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width="22%">
<BLOCKQUOTE><FONT size=+0>
<P>bmiColors</FONT></P></BLOCKQUOTE></TD>
<TD width="78%">
<BLOCKQUOTE><FONT size=+0>
<P>说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。</FONT></P></BLOCKQUOTE></TD></TR></TBODY></TABLE>
<P><FONT size=+0>BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:</FONT> </P>
<P><FONT size=+0>typedef struct tagBITMAPINFOHEADER { /* bmih */</FONT>
<BLOCKQUOTE><FONT size=+0>DWORD biSize;</FONT> <BR><FONT size=+0>LONG
biWidth;</FONT> <BR><FONT size=+0>LONG biHeight;</FONT> <BR><FONT size=+0>WORD
biPlanes;</FONT> <BR><FONT size=+0>WORD biBitCount;</FONT> <BR><FONT
size=+0>DWORD biCompression;</FONT> <BR><FONT size=+0>DWORD
biSizeImage;</FONT> <BR><FONT size=+0>LONG biXPelsPerMeter;</FONT> <BR><FONT
size=+0>LONG biYPelsPerMeter;</FONT> <BR><FONT size=+0>DWORD biClrUsed;</FONT>
<BR><FONT size=+0>DWORD biClrImportant;</FONT><BR></BLOCKQUOTE><FONT size=+0>}
BITMAPINFOHEADER;</FONT>
<P></P>
<P><FONT size=+0>其中:</FONT> <BR> </P>
<TABLE cellSpacing=0 width=565 border=0>
<TBODY>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biSize</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>说明BITMAPINFOHEADER结构所需要的字数。注:这个值并不一定是BITMAPINFOHEADER结构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像都是BITMAPINFOHEADER结构的(可能是后两者太新的缘故吧:-)。</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biWidth</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>说明图象的宽度,以象素为单位</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biHeight</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个负数时(正向图像),图像将不能被压缩(也就是说biCompression成员将不能是BI_RLE8或BI_RLE4)。</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biPlanes</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>为目标设备说明位面数,其值将总是被设为1</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biBitCount</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>说明比特数/象素,其值为1、4、8、16、24、或32</FONT></P></BLOCKQUOTE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biCompression</FONT></P></BLOCKQUOTE></TD>
<TD width=414><FONT size=+0>说明图象数据压缩的类型。其值可以是下述值之一:</FONT> <BR><!--msthemelist-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0><!--msthemelist-->
<TBODY>
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">BI_RGB:没有压缩;
<BR><!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top
width="100%">BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引); <BR><!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成 <BR><!--msthemelist--></TD></TR><!--msthemelist-->
<TR>
<TD vAlign=baseline width=42><IMG height=20 hspace=11
src="BMP文件格式分析.files/urbbul1a.gif" width=20></TD>
<TD vAlign=top width="100%">BI_BITFIELDS:每个象素的比特由指定的掩码决定。<BR><!--msthemelist--></TD></TR><!--msthemelist--></TBODY></TABLE></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biSizeImage</FONT></P></BLOCKQUOTE></TD>
<TD width=414><FONT size=+0>说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0</FONT></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biXPelsPerMeter</FONT></P></BLOCKQUOTE></TD>
<TD width=414><FONT size=+0>说明水平分辨率,用象素/米表示</FONT></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biYPelsPerMeter</FONT></P></BLOCKQUOTE></TD>
<TD width=414><FONT size=+0>说明垂直分辨率,用象素/米表示</FONT></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biClrUsed</FONT></P></BLOCKQUOTE></TD>
<TD width=414><FONT
size=+0>说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)</FONT></TD></TR>
<TR>
<TD width=147>
<BLOCKQUOTE><FONT size=+0>
<P>biClrImportant</FONT></P></BLOCKQUOTE></TD>
<TD width=414>
<BLOCKQUOTE><FONT size=+0>
<P>说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。</FONT></P></BLOCKQUOTE></TD></TR></TBODY></TABLE>
<P><FONT size=+0>现就BITMAPINFOHEADER结构作如下说明:</FONT> </P>
<P><B><FONT size=+0>(1) 彩色表的定位</FONT></B> </P>
<P><FONT size=+0>应用程序可使用存储在biSize成员中的信息来查找在BITMAPINFO结构中的彩色表,如下所示:</FONT> </P>
<P><FONT size=+0>pColor = ((LPSTR) pBitmapInfo + (WORD)
(pBitmapInfo->bmiHeader.biSize))</FONT> </P>
<P><B><FONT size=+0>(2) biBitCount</FONT></B> </P>
<P><FONT size=+0><B>biBitCount=1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -