?? bmp_fileformat.htm
字號:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>BMP文件格式分析</title>
<meta name="Microsoft Theme" content="construc 011"></head>
<body background="urbtextb.gif" bgcolor="#FFCC66" text="#000000" link="#990033" vlink="#666666" alink="#FF0000">
<table align="center" cols="1" width="760">
<tr>
<td align="right" height=26>
<font face="宋體" size="3" color="#5FC2B4">
<a href="http://isee.126.com">VCHelp coPathway ISee project</a><br>
</font>
<font face="宋體" size="2" color="#7AA794">
編譯: YZ</font><br>
<font face="宋體" size="2" color="#7AA794">
電郵: yzfree@sina.com</font><br>
<font face="宋體" size="2" color="#7AA794">
日期: 2000-8-13</font><br>
</td>
</tr>
<tr align="center">
<td align="center" width="100%">
<br>
<br>
<font face="黑體" color="#604AA8" size="5"><strong>BMP文件格式分析</strong></font>
<br>
<br>
</td>
</tr>
</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 BORDER="1" CELLSPACING="2" WIDTH="510" bordercolordark="#000000" bordercolorlight="#CC6600">
<tr>
<td WIDTH="232"><p align="center"><font size="+0">位圖文件的組成</font> </td>
<td WIDTH="157"><p align="center"><font size="+0">結構名稱</font> </td>
<td WIDTH="103"><p align="center"><font size="+0">符號</font> </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>
</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 BORDER="1" CELLSPACING="2" CELLPADDING="7" WIDTH="585" bordercolordark="#000000" bordercolorlight="#CC6600">
<tr>
<td WIDTH="18"> </td>
<td WIDTH="43"><p align="center"><b><font size="+0">偏移量</font></b> </td>
<td WIDTH="96"><p align="center"><b><font size="+0">域的名稱</font></b> </td>
<td WIDTH="58"><p align="center"><b><font size="+0">大小</font></b> </td>
<td WIDTH="287"><p align="center"><b><font size="+0">內容</font></b> </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></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></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> </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></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></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>
<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 border="0" cellpadding="0" cellspacing="0" width="100%">
<!--msthemelist--><tr><td valign="baseline" width="42"><img src="urbbul1a.gif" width="20" height="20" hspace="11"></td><td valign="top" width="100%">1字節用于藍色分量<!--msthemelist--></td></tr>
<!--msthemelist--><tr><td valign="baseline" width="42"><img src="urbbul1a.gif" width="20" height="20" hspace="11"></td><td valign="top" width="100%">1字節用于綠色分量<!--msthemelist--></td></tr>
<!--msthemelist--><tr><td valign="baseline" width="42"><img src="urbbul1a.gif" width="20" height="20" hspace="11"></td><td valign="top" width="100%">1字節用于紅色分量<!--msthemelist--></td></tr>
<!--msthemelist--><tr><td valign="baseline" width="42"><img src="urbbul1a.gif" width="20" height="20" hspace="11"></td><td valign="top" width="100%">1字節用于填充符(設置為0)<!--msthemelist--></td></tr>
<!--msthemelist--></table>
</td>
</tr>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -