📄 bmp文件格式分析.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0047)http://www.aivisoft.net/Documents/BMPFormat.htm -->
<!-- saved from url=(0054)file://G:\fantasiasoftweb\FileInfo\BMP文件格式分析.htm --><!-- saved from url=(0062)http://asp.6to23.com/iseesoft/devdoc/imgdoc/bmp_fileformat.htm --><HTML><HEAD><TITLE>BMP文件格式分析</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2769" name=GENERATOR>
<META content="construc 011" name="Microsoft Theme"></HEAD>
<BODY text=#000000 vLink=#666666 aLink=#ff0000 link=#990033 bgColor=#ffcc66
background=BMP文件格式分析.files/urbtextb.gif>
<TABLE cols=1 width=760 align=center>
<TBODY>
<TR>
<TD align=right height=26><FONT face=宋体 color=#5fc2b4 size=3><A
href="http://isee.126.com/">VCHelp coPathway ISee
project</A><BR></FONT><FONT face=宋体 color=#7aa794
size=2>编译: YZ</FONT><BR><FONT face=宋体 color=#7aa794
size=2>电邮: yzfree@sina.com</FONT><BR><FONT face=宋体 color=#7aa794
size=2>日期: 2000-8-13</FONT><BR></TD></TR>
<TR align=middle>
<TD align=middle width="100%"><BR><BR><FONT face=黑体 color=#604aa8
size=5><STRONG>BMP文件格式分析</STRONG></FONT>
<BR><BR></TD></TR></TBODY></TABLE><BR><BR><BR><BR>
<P align=center><FONT
size=+0>本来不想写这篇东西,因为介绍BMP文件结构的资料太多了,都有些滥了。但刚写完BMP的读写模块,又不想不留下点什么,所以就写了,全当是学习笔记吧。自己以后查资料时也方便一些,也许对某些初哥还会有点用^_^<BR><BR><BR><BR>注:本文参考了<A
href="mailto:linfz@mail.tsinghua.edu.cn">林福宗</A>老师的有关BMP文件格式的文章,在此声明。</FONT>
</P><BR><BR><BR><BR><BR><BR><BR>
<BLOCKQUOTE><B><FONT color=#ff0000>
<P align=center>简介</FONT></B></P></BLOCKQUOTE><FONT size=+0>
<P>BMP(<B>B</B>it<B>m</B>a<B>p</B>-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows
3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(<B>d</B>evice-<B>d</B>ependent
<B>b</B>itmap)文件格式。Windows
3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(<B>d</B>evice-<B>i</B>ndependent
<B>b</B>itmap)格式(注:Windows
3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。</FONT>
</P>
<BLOCKQUOTE><B><FONT color=#ff0000>
<P>6.1.2 文件结构</FONT></B></P></BLOCKQUOTE><FONT size=+0>
<P align=center>位图文件可看成由4个部分组成:位图文件头(bitmap-file
header)、位图信息头(bitmap-information header)、彩色表(color
table)和定义位图的字节阵列,它具有如下所示的形式。</FONT> </P>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=2 borderColorDark=#000000 width=510 borderColorLight=#cc6600
border=1>
<TBODY>
<TR>
<TD width=232>
<P align=center><FONT size=+0>位图文件的组成</FONT> </P></TD>
<TD width=157>
<P align=center><FONT size=+0>结构名称</FONT> </P></TD>
<TD width=103>
<P align=center><FONT size=+0>符号</FONT> </P></TD></TR>
<TR>
<TD width=232><FONT size=+0>位图文件头(bitmap-file header)</FONT></TD>
<TD width=157><FONT size=+0>BITMAPFILEHEADER</FONT></TD>
<TD width=103><FONT size=+0>bmfh</FONT></TD></TR>
<TR>
<TD width=232><FONT size=+0>位图信息头(bitmap-information header)</FONT></TD>
<TD width=157><FONT size=+0>BITMAPINFOHEADER</FONT></TD>
<TD width=103><FONT size=+0>bmih</FONT></TD></TR>
<TR>
<TD width=232><FONT size=+0>彩色表(color table)</FONT></TD>
<TD width=157><FONT size=+0>RGBQUAD</FONT></TD>
<TD width=103><FONT size=+0>aColors[]</FONT></TD></TR>
<TR>
<TD width=232><FONT size=+0>图象数据阵列字节</FONT></TD>
<TD width=157><FONT size=+0>BYTE</FONT></TD>
<TD width=103><FONT
size=+0>aBitmapBits[]</FONT></TD></TR></TBODY></TABLE></CENTER></DIV><FONT
size=+0>
<P>位图文件结构可综合在表6-01中。</FONT> </P>
<BLOCKQUOTE><B><FONT size=+0>
<P align=center>表01 位图文件结构内容摘要</FONT></B> </P></BLOCKQUOTE>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=2 borderColorDark=#000000 cellPadding=7 width=585
borderColorLight=#cc6600 border=1>
<TBODY>
<TR>
<TD width=18> </TD>
<TD width=43>
<P align=center><B><FONT size=+0>偏移量</FONT></B> </P></TD>
<TD width=96>
<P align=center><B><FONT size=+0>域的名称</FONT></B> </P></TD>
<TD width=58>
<P align=center><B><FONT size=+0>大小</FONT></B> </P></TD>
<TD width=287>
<P align=center><B><FONT size=+0>内容</FONT></B> </P></TD></TR>
<TR>
<TD width=27><FONT size=+0> </FONT>
<P><FONT size=+0> </FONT> </P>
<P><FONT size=+0> </FONT> </P>
<P><FONT size=+0>图象文件</FONT> </P>
<P><FONT size=+0>头</FONT></P></TD>
<TD width=43><FONT size=+0>0000h</FONT></TD>
<TD width=80><FONT size=+0>文件标识</FONT></TD>
<TD width=58><FONT size=+0>2 bytes</FONT></TD>
<TD width=287><FONT size=+0>两字节的内容用来识别位图的类型:</FONT>
<P><FONT size=+0>‘BM’ : Windows 3.1x, 95, NT, …</FONT> </P>
<P><FONT size=+0>‘BA’ :OS/2 Bitmap Array</FONT> </P>
<P><FONT size=+0>‘CI’ :OS/2 Color Icon</FONT> </P>
<P><FONT size=+0>‘CP’ :OS/2 Color Pointer</FONT> </P>
<P><FONT size=+0>‘IC’ : OS/2 Icon</FONT> </P>
<P><FONT size=+0>‘PT’ :OS/2 Pointer</FONT></P>
<P><FONT
size=+0>注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。</FONT></P></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0002h</FONT></TD>
<TD width=80><FONT size=+0>File Size</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>用字节表示的整个文件的大小</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0006h</FONT></TD>
<TD width=80><FONT size=+0>Reserved</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>保留,必须设置为0</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>000Ah</FONT></TD>
<TD width=80><FONT size=+0>Bitmap Data Offset</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>从文件开始到位图数据开始之间的数据(bitmap
data)之间的偏移量</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>000Eh</FONT></TD>
<TD width=80><FONT size=+0>Bitmap Header Size</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>位图信息头(Bitmap Info
Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:</FONT>
<P><FONT size=+0>28h - Windows 3.1x, 95, NT, …</FONT> </P>
<P><FONT size=+0>0Ch - OS/2 1.x</FONT> </P>
<P><FONT size=+0>F0h - OS/2 2.x</FONT></P>
<P><FONT
size=+0>注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。</FONT></P></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0012h</FONT></TD>
<TD width=80><FONT size=+0>Width</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>位图的宽度,以象素为单位</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0016h</FONT></TD>
<TD width=80><FONT size=+0>Height</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>位图的高度,以象素为单位</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>001Ah</FONT></TD>
<TD width=80><FONT size=+0>Planes</FONT></TD>
<TD width=58><FONT size=+0>1 word</FONT></TD>
<TD width=287><FONT size=+0>位图的位面数(注:该值将总是1)</FONT></TD></TR>
<TR>
<TD width=27><BR><FONT size=+0>图象</FONT>
<P><FONT size=+0>信息</FONT> </P>
<P><FONT size=+0>头</FONT> </P>
<P><FONT size=+0> </FONT> </P>
<P> </P></TD>
<TD width=43><FONT size=+0>001Ch</FONT></TD>
<TD width=80><FONT size=+0>Bits Per Pixel</FONT></TD>
<TD width=58><FONT size=+0>1 word</FONT></TD>
<TD width=287><FONT size=+0>每个象素的位数</FONT>
<P><FONT size=+0>1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)</FONT> </P>
<P><FONT size=+0>4 - 16 色位图</FONT> </P>
<P><FONT size=+0>8 - 256 色位图</FONT> </P>
<P><FONT size=+0>16 - 16bit 高彩色位图</FONT> </P>
<P><FONT size=+0>24 - 24bit 真彩色位图</FONT> </P>
<P><FONT size=+0>32 - 32bit 增强型真彩色位图</FONT></P></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>001Eh</FONT></TD>
<TD width=80><FONT size=+0>Compression</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>压缩说明:</FONT>
<P><FONT size=+0>0 - 不压缩 (使用BI_RGB表示)</FONT> </P>
<P><FONT size=+0>1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)</FONT> </P>
<P><FONT size=+0>2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)</FONT> </P>
<P><FONT size=+0>3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)</FONT></P></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0022h</FONT></TD>
<TD width=80><FONT size=+0>Bitmap Data Size</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>用字节数表示的位图数据的大小。该数必须是4的倍数</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0026h</FONT></TD>
<TD width=80><FONT size=+0>HResolution</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>用象素/米表示的水平分辨率</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>002Ah</FONT></TD>
<TD width=80><FONT size=+0>VResolution</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>用象素/米表示的垂直分辨率</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>002Eh</FONT></TD>
<TD width=80><FONT size=+0>Colors</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT size=+0>位图使用的颜色数。如8-比特/象素表示为100h或者 256.</FONT></TD></TR>
<TR>
<TD width=27> </TD>
<TD width=43><FONT size=+0>0032h</FONT></TD>
<TD width=80><FONT size=+0>Important Colors</FONT></TD>
<TD width=58><FONT size=+0>1 dword</FONT></TD>
<TD width=287><FONT
size=+0>指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要</FONT></TD></TR>
<TR>
<TD width=27><FONT size=+0>调色板数据</FONT></TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -