<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/bg1.jpg"><div class="c x0 y1 w2 h0"><div class="t m0 x1 h2 y2 ff1 fs0 fc0 sc0 ls0 ws0">第</div></div><div class="t m0 x2 h3 y2 ff2 fs0 fc0 sc1 ls0 ws0">1</div><div class="c x0 y1 w2 h0"><div class="t m0 x3 h2 y2 ff3 fs0 fc0 sc0 ls0 ws0">章</div></div><div class="t m0 x4 h3 y2 ff2 fs0 fc0 sc1 ls0 ws0"> <span class="_"> </span><span class="ls1 ws1">W<span class="_ _0"></span>indows</span></div><div class="c x0 y1 w2 h0"><div class="t m0 x5 h2 y2 ff3 fs0 fc0 sc0 ls2 ws2">位图和调色板</div></div><div class="t m0 x6 h3 y2 ff2 fs0 fc0 sc1 ls0 ws0"> </div><div class="t m0 x1 h4 y3 ff2 fs1 fc0 sc1 ls0 ws0">1.1 </div><div class="c x0 y1 w2 h0"><div class="t m0 x7 h5 y3 ff1 fs1 fc0 sc0 ls3 ws3">位图和调色板的概念</div></div><div class="t m0 x8 h4 y3 ff2 fs1 fc0 sc1 ls0 ws0"> </div><div class="t m0 x1 h6 y4 ff1 fs2 fc0 sc1 ls0 ws0">如今<span class="_ _1"> </span><span class="ff4 ls4 ws4">Windows<span class="_ _0"></span>(3.x<span class="_"> </span><span class="ff1 ls0 ws0">以及<span class="_ _1"> </span></span>95<span class="ff1 ls0 ws0">,<span class="_ _2"></span><span class="ff4 ls4 ws4">98<span class="ff1 ls0 ws0">,<span class="_ _2"></span><span class="ff4 ls5 ws5">NT)<span class="ff1 ls0 ws0">系列已经成为绝大多数用户使用的操作系统,<span class="_ _2"></span>它比<span class="_ _1"> </span><span class="ff4 ls5 ws5">DOS</span></span></span></span></span></span></span></div><div class="t m0 x1 h6 y5 ff1 fs2 fc0 sc1 ls0 ws0">成功的一个重要因素是它可视化的漂亮界面。那么<span class="_ _3"> </span><span class="ff4 ls4 ws4">Windows<span class="_ _3"> </span></span>是如何显示图象的呢?这就要</div><div class="t m0 x1 h6 y6 ff1 fs2 fc0 sc1 ls0 ws0">谈到位图<span class="ff4 ls6 ws6">(bitmap)</span>。<span class="ff4"> </span></div><div class="t m0 x1 h7 y7 ff1 fs2 fc0 sc1 ls0 ws0">我们知道,<span class="_ _4"></span>普通的显示器屏幕是由许许多多点构成的,<span class="_ _4"></span>我们称之为象素。<span class="_ _4"></span>显示时采用扫描的</div><div class="t m0 x1 h7 y8 ff1 fs2 fc0 sc1 ls0 ws0">方法:<span class="_ _5"></span>电子枪每次从左到右扫描一行,<span class="_ _5"></span>为每个象素着色,<span class="_ _5"></span>然后从上到下这样扫描若干行,<span class="_ _5"></span>就</div><div class="t m0 x1 h7 y9 ff1 fs2 fc0 sc1 ls7 ws7">扫过了一屏。为了防止闪烁,<span class="_ _0"></span>每秒要重复上述过程几十次。例如<span class="_ _0"></span>我们常说的屏幕分辨率为</div><div class="t m0 x1 h6 ya ff4 fs2 fc0 sc1 ls4 ws4">640×480<span class="ff1 ls0 ws0">,<span class="_ _5"></span>刷新频率为<span class="_ _1"> </span><span class="ff4 ls8 ws8">70Hz</span>,<span class="_ _5"></span>意思是说每行要扫描<span class="_ _1"> </span><span class="ff4 ls8 ws8">640<span class="_"> </span></span>个象素,<span class="_ _5"></span>一共有<span class="_ _1"> </span><span class="ff4 ls4 ws4">480<span class="_"> </span></span>行,<span class="_ _6"></span>每秒重复扫</span></div><div class="t m0 x1 h6 yb ff1 fs2 fc0 sc1 ls0 ws0">描屏幕<span class="_ _1"> </span><span class="ff4 ls8 ws8">70<span class="_"> </span></span><span class="ls9 ws9">次。</span><span class="ff4"> </span></div><div class="t m0 x1 h7 yc ff1 fs2 fc0 sc1 ls0 ws0">我们称这种显示器为位映象设备。<span class="_ _4"></span>所谓位映象,<span class="_ _4"></span>就是指一个二维的象素矩阵,<span class="_ _4"></span>而位图就是采</div><div class="t m0 x1 h6 yd ff1 fs2 fc0 sc1 ls0 ws0">用位映象方法显示和存储的图象。举个例子,图<span class="_ _1"> </span><span class="ff4 lsa wsa">1.1<span class="_ _7"> </span></span>是一幅普通的黑白位图,图<span class="_ _1"> </span><span class="ff4 lsa wsa">1.2<span class="_"> </span></span>是被放</div><div class="t m0 x1 h7 ye ff1 fs2 fc0 sc1 ls0 ws0">大后的图,<span class="_ _4"></span>图中每个方格代表了一个象素。<span class="_ _4"></span>我们可以看到:<span class="_ _4"></span>整个骷髅就是由这样一些黑点和</div><div class="t m0 x1 h6 yf ff1 fs2 fc0 sc1 ls0 ws0">白点组成的。<span class="ff4"> </span></div><div class="t m0 x9 h8 y10 ff4 fs3 fc0 sc1 ls0 ws0"> </div><div class="c xa y11 w3 h9"><div class="t m0 xb ha y12 ff1 fs3 fc0 sc0 ls0 ws0">图<span class="_ _7"> </span><span class="ff2 sc1">1.1 <span class="_"> </span></span><span class="lsb wsb">骷髅</span><span class="ff4 sc1"> </span></div></div><div class="t m0 xc h6 y13 ff4 fs2 fc0 sc1 ls0 ws0"> </div><div class="c xd y11 w3 h9"><div class="t m0 xe hb y14 ff1 fs2 fc0 sc0 ls0 ws0">图<span class="_ _1"> </span><span class="ff2 sc1 lsc wsc">1.2<span class="ls0 ws0"> <span class="_"> </span></span></span><span class="lsd wsd">放大后的骷髅位图</span><span class="ff4 sc1"> </span></div></div><div class="t m0 x1 h6 y15 ff1 fs2 fc0 sc1 ls0 ws0">那么,彩色图是怎么回事呢?<span class="ff4"> </span></div><div class="t m0 x1 h6 y16 ff1 fs2 fc0 sc1 ls0 ws0">我们先来说说三元色<span class="_ _1"> </span><span class="ff4 ls5 ws5">RGB<span class="_"> </span></span>概念。<span class="ff4"> </span></div><div class="t m0 x1 h6 y17 ff1 fs2 fc0 sc1 ls0 ws0">我们知道,<span class="_ _0"></span>自然界中的所有颜色都可以由红、<span class="_ _0"></span>绿、蓝<span class="ff4 ls5 ws5">(R</span>,<span class="_ _0"></span><span class="ff4">G<span class="ff1">,<span class="_ _0"></span><span class="ff4 ls6 ws6">B)<span class="ff1 ls0 ws0">组合而成。<span class="_ _0"></span>有的颜色含有红</span></span></span></span></div><div class="t m0 x1 h7 y18 ff1 fs2 fc0 sc1 ls0 ws0">色成分多一些,<span class="_ _5"></span>如深红;<span class="_ _8"></span>有的含有红色成分少一些,<span class="_ _5"></span>如浅红。<span class="_ _8"></span>针对含有红色成分的多少,<span class="_ _5"></span>可</div><div class="t m0 x1 h6 y19 ff1 fs2 fc0 sc1 ls0 ws0">以分成<span class="_ _1"> </span><span class="ff4">0<span class="_"> </span></span>到<span class="_ _1"> </span><span class="ff4 ls8 ws8">255<span class="_"> </span></span>共<span class="_ _1"> </span><span class="ff4 ls8 ws8">256<span class="_"> </span></span>个等级,<span class="ff4">0<span class="_"> </span></span>级表示不含红色成分;<span class="ff4 ls4 ws4">255<span class="_"> </span></span>级表示含有<span class="_ _1"> </span><span class="ff4 ls8 ws8">100%</span>的红色成分。</div><div class="t m0 x1 h6 y1a ff1 fs2 fc0 sc1 ls0 ws0">同样,绿色和蓝色也被分成<span class="_ _1"> </span><span class="ff4 ls8 ws8">256<span class="_"> </span></span>级。这种分级概念称为量化。<span class="ff4"> </span></div><div class="t m0 x1 h6 y1b ff1 fs2 fc0 sc1 ls0 ws0">这样,根据红、绿、蓝各种不同的组合我们就能表示出<span class="_ _9"> </span><span class="ff4 ls8 ws8">256×256×2<span class="_ _a"></span>56</span><span class="ls9 ws9">,约<span class="_ _9"> </span><span class="ff4 ls4 ws4">1600<span class="_ _9"> </span></span></span>万种颜色。</div><div class="t m0 x1 h6 y1c ff1 fs2 fc0 sc1 ls0 ws0">这么多颜色对于我们人眼来说已经足够丰富了。<span class="ff4"> </span></div><div class="c x0 y1 w2 h0"><div class="t m0 xf h7 y1d ff1 fs2 fc0 sc0 ls0 ws0">表</div></div><div class="t m0 x10 hb y1d ff2 fs2 fc0 sc1 lsc wsc">1.1<span class="ls0 ws0"> </span></div><div class="c x0 y1 w2 h0"><div class="t m0 x11 h7 y1d ff1 fs2 fc0 sc0 lsd wsd">常见颜色的</div></div><div class="t m0 x12 hb y1d ff2 fs2 fc0 sc1 ls9 ws9">RGB</div><div class="c x0 y1 w2 h0"><div class="t m0 x13 h7 y1d ff1 fs2 fc0 sc0 lsd wsd">组合值</div></div><div class="t m0 x14 h6 y1d ff4 fs2 fc0 sc1 ls0 ws0"> </div><div class="t m0 x15 hc y1e ff1 fs3 fc0 sc1 ls0 ws0">颜色</div><div class="c x16 y1f w4 hd"><div class="t m0 x17 h8 y12 ff4 fs3 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y1f w5 hd"><div class="t m0 x18 h8 y20 ff4 fs3 fc0 sc1 ls0 ws0">R </div></div><div class="c xd y1f w4 hd"><div class="t m0 x18 h8 y20 ff4 fs3 fc0 sc1 ls0 ws0">G </div></div><div class="c x19 y1f w6 hd"><div class="t m0 x18 h8 y20 ff4 fs3 fc0 sc1 ls0 ws0">B </div></div><div class="t m0 x1a h7 y21 ff1 fs2 fc0 sc1 ls0 ws0">红</div><div class="c x16 y22 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y22 w5 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c xd y22 w4 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c x19 y22 w6 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div></div><div class="pi" data-data='{"ctm":[1.611792,0.000000,0.000000,1.611792,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/bg2.jpg"><div class="t m0 x1a h7 y24 ff1 fs2 fc0 sc1 ls0 ws0">蓝</div><div class="c x16 y25 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y25 w5 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c xd y25 w4 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c x19 y25 w6 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="t m0 x1a h7 y26 ff1 fs2 fc0 sc1 ls0 ws0">绿</div><div class="c x16 y27 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y27 w5 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c xd y27 w4 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c x19 y27 w6 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="t m0 x1a h7 y28 ff1 fs2 fc0 sc1 ls0 ws0">黄</div><div class="c x16 y29 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y29 w5 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c xd y29 w4 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c x19 y29 w6 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="t m0 x1a h7 y2a ff1 fs2 fc0 sc1 ls0 ws0">紫</div><div class="c x16 y2b w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y2b w5 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c xd y2b w4 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c x19 y2b w6 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="t m0 x1a h7 y2c ff1 fs2 fc0 sc1 ls0 ws0">青</div><div class="c x16 y2d w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y2d w5 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c xd y2d w4 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c x19 y2d w6 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="t m0 x1a h7 y2e ff1 fs2 fc0 sc1 ls0 ws0">白</div><div class="c x16 y2f w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y2f w5 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c xd y2f w4 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="c x19 y2f w6 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">255<span class="ls0 ws0"> </span></div></div><div class="t m0 x1a h7 y30 ff1 fs2 fc0 sc1 ls0 ws0">黑</div><div class="c x16 y31 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y31 w5 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c xd y31 w4 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="c x19 y31 w6 hd"><div class="t m0 x1d h6 y23 ff4 fs2 fc0 sc1 ls0 ws0">0 </div></div><div class="t m0 x1a h7 y32 ff1 fs2 fc0 sc1 ls0 ws0">灰</div><div class="c x16 y33 w4 hd"><div class="t m0 x1b h6 y14 ff4 fs2 fc0 sc1 ls0 ws0"> </div></div><div class="c xf y33 w5 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">128<span class="ls0 ws0"> </span></div></div><div class="c xd y33 w4 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">128<span class="ls0 ws0"> </span></div></div><div class="c x19 y33 w6 hd"><div class="t m0 x1c h6 y23 ff4 fs2 fc0 sc1 ls8 ws8">128<span class="ls0 ws0"> </span></div></div><div class="t m0 x1 h6 y34 ff1 fs2 fc0 sc1 ls0 ws0">你大概已经明白了,当一幅图中每个象素赋予不同的<span class="_ _1"> </span><span class="ff4 ls5 ws5">RGB<span class="_"> </span></span>值时,能呈现出五彩缤纷的颜色</div><div class="t m0 x1 h6 y35 ff1 fs2 fc0 sc1 ls0 ws0">了,这样就形成了彩色图。的确是这样的,但实际上的做法还有些差别。<span class="ff4"> </span></div><div class="t m0 x1 h6 y36 ff1 fs2 fc0 sc1 ls0 ws0">让我们来看看下面的例子。<span class="ff4"> </span></div><div class="t m0 x1 h6 y37 ff1 fs2 fc0 sc1 ls0 ws0">有一个长宽各为<span class="_ _9"> </span><span class="ff4 ls4 ws4">200<span class="_ _3"> </span></span>个象素,颜色数为<span class="_ _9"> </span><span class="ff4 ls4 ws4">16<span class="_ _3"> </span></span>色的<span class="_ _0"></span>彩色图,每一个象素都用<span class="_ _3"> </span><span class="ff4">R</span>、<span class="ff4">G</span>、<span class="ff4">B<span class="_ _9"> </span></span>三个分</div><div class="t m0 x1 h6 y38 ff1 fs2 fc0 sc1 ls0 ws0">量表示。因为每个分量有<span class="_ _3"> </span><span class="ff4 ls4 ws4">256<span class="_ _3"> </span></span>个级别,要用<span class="_ _3"> </span><span class="ff4">8<span class="_ _3"> </span></span>位<span class="ff4 ls6 ws6">(bit)</span>,即一个字节<span class="ff4 ls6 ws6">(byte)<span class="_ _0"></span><span class="ff1 ls0 ws0">来表示,所以每个</span></span></div><div class="t m0 x1 h6 y39 ff1 fs2 fc0 sc1 ls0 ws0">象素需要用<span class="_ _7"> </span><span class="ff4">3<span class="_ _7"> </span></span>个字节。整个图象要用<span class="_ _7"> </span><span class="ff4 ls4 ws4">200×200×3</span><span class="ls9 ws9">,约<span class="_ _7"> </span><span class="ff4 ls4 ws4">120k<span class="_ _7"> </span></span>字节,</span>可不是一个小数目呀!如</div><div class="t m0 x1 h6 y3a ff1 fs2 fc0 sc1 ls0 ws0">果我们用下面的方法,就能省的多。<span class="ff4"> </span></div><div class="t m0 x1 h6 y3b ff1 fs2 fc0 sc1 ls0 ws0">因为是一个<span class="_ _1"> </span><span class="ff4 ls8 ws8">16<span class="_"> </span></span>色图,<span class="_ _4"></span>也就是说这幅图中最多只有<span class="_ _1"> </span><span class="ff4 ls8 ws8">16<span class="_"> </span></span>种颜色,<span class="_ _4"></span>我们可以用一个表:<span class="_ _4"></span>表中的每</div><div class="t m0 x1 h6 y3c ff1 fs2 fc0 sc1 ls0 ws0">一行记录一种颜色的<span class="_ _1"> </span><span class="ff4">R</span>、<span class="ff4">G</span>、<span class="ff4">B<span class="_"> </span></span>值。这样当我们表示一个象素的颜色时,只需要指出该颜色</div><div class="t m0 x1 h6 y3d ff1 fs2 fc0 sc1 ls0 ws0">是在第几行,即该颜色在表中的索引值。举个例子,如果表的第<span class="_ _7"> </span><span class="ff4">0<span class="_ _9"> </span></span><span class="ls9 ws9">行为<span class="_ _9"> </span><span class="ff4 ls8 ws8">255</span></span>,<span class="ff4">0</span>,<span class="ff4 ls8 ws8">0(</span>红色<span class="ff4">)</span>,</div><div class="t m0 x1 h6 y3e ff1 fs2 fc0 sc1 ls0 ws0">那么当某个象素为红色时,只需要标明<span class="_ _1"> </span><span class="ff4">0<span class="_"> </span></span><span class="ls9 ws9">即可。</span><span class="ff4"> </span></div><div class="t m0 x1 h6 y3f ff1 fs2 fc0 sc1 ls0 ws0">让我们再来计算一下:<span class="_ _4"></span><span class="ff4 ls8 ws8">16<span class="_"> </span><span class="ff1 ls0 ws0">种状态可以用<span class="_ _1"> </span><span class="ff4">4<span class="_"> </span></span>位</span><span class="ls6 ws6">(bit)<span class="ff1 ls0 ws0">表示,<span class="_ _4"></span>所以一个象素要用半个字节。<span class="_ _4"></span>整个图</span></span></span></div><div class="t m0 x1 h6 y40 ff1 fs2 fc0 sc1 ls0 ws0">象要用<span class="_ _1"> </span><span class="ff4 ls4 ws4">200×200×<span class="_ _0"></span>0.5<span class="ff1 lse wse">,约<span class="_ _b"> </span></span><span class="ls8 ws8">20k<span class="_"> </span><span class="ff1 ls0 ws0">字节,<span class="_ _c"></span>再加上表占用的字节为<span class="_ _1"> </span><span class="ff4 ls4 ws4">3×16=4</span><span class="ff4">8<span class="_"> </span></span>字节<span class="ff4">.</span>整个占用的字节数</span></span></span></div><div class="t m0 x1 h6 y41 ff1 fs2 fc0 sc1 ls0 ws0">约为前面的<span class="_ _1"> </span><span class="ff4 ls8 ws8">1/6</span>,省很多吧?<span class="ff4"> </span></div><div class="t m0 x1 h6 y42 ff1 fs2 fc0 sc1 ls0 ws0">这张<span class="_ _1"> </span><span class="ff4">R</span>、<span class="ff4">G</span>、<span class="ff4">B<span class="_"> </span></span>的表,就<span class="_ _0"></span>是我们常说的调色板<span class="ff4 ls6 ws6">(Palette)</span>,另一种叫法是颜色查找表<span class="_ _1"> </span><span class="ff4 lsa wsa">LUT(Loo<span class="_ _0"></span>k </span></div><div class="t m0 x1 h6 y43 ff4 fs2 fc0 sc1 ls6 wsf">Up Table)<span class="ff1 ls0 ws0">,似乎更确切一些。</span><span class="ls8 ws8">Windows<span class="_ _7"> </span><span class="ff1 ls0 ws0">位图中便用到了调色板技术。其实不光是<span class="_ _7"> </span></span>Windows</span></div><div class="t m0 x1 h6 y44 ff1 fs2 fc0 sc1 ls0 ws0">位图,<span class="_ _5"></span>许多图象文件格式如<span class="_ _1"> </span><span class="ff4 lsc wsc">p<span class="_ _a"></span>cx</span>、<span class="_ _5"></span><span class="ff4 ls6 ws6">tif<span class="ff1 ls0 ws0">、<span class="_ _6"></span><span class="ff4 ls6 ws6">gif<span class="_"> </span><span class="ff1 ls0 ws0">等都用到了。<span class="_ _5"></span>所以很好地掌握调色板的概念是十分</span></span></span></span></div><div class="t m0 x1 h6 y45 ff1 fs2 fc0 sc1 ls0 ws0">有用的。<span class="ff4"> </span></div><div class="t m0 x1 h6 y46 ff1 fs2 fc0 sc1 ls0 ws0">有一种图,<span class="_ _0"></span>它的颜色数高达<span class="_ _1"> </span><span class="ff4 ls8 ws8">256×256×2<span class="_ _a"></span>56<span class="_"> </span></span>种,<span class="_ _0"></span>也就是说包含我们上述提到的<span class="_ _1"> </span><span class="ff4">R</span>、<span class="_ _0"></span><span class="ff4">G<span class="ff1">、<span class="_ _0"></span><span class="ff4">B<span class="_"> </span><span class="ff1 lsd wsd">颜色</span></span></span></span></div><div class="t m0 x1 h6 y47 ff1 fs2 fc0 sc1 ls0 ws0">表示方法中所有的颜色,这种图叫做真彩色图<span class="ff4 ls5 ws10">(true color)</span>。真彩色图并不是说一幅图包含了</div><div class="t m0 x1 h7 y48 ff1 fs2 fc0 sc1 ls0 ws0">所有的颜色,<span class="_ _4"></span>而是说它具有显示所有颜色的能力,<span class="_ _4"></span>即最多可以包含所有的颜色。<span class="_ _4"></span>表示真彩色</div><div class="t m0 x1 h6 y49 ff1 fs2 fc0 sc1 ls0 ws0">图时,每个象素直接用<span class="_ _1"> </span><span class="ff4">R</span>、<span class="ff4">G</span>、<span class="ff4">B<span class="_"> </span></span>三个分量字节表示,而不采用调色板技术。原因很明显:</div><div class="t m0 x1 h6 y4a ff1 fs2 fc0 sc1 ls0 ws0">如果用调色板,表示一个象素也要用<span class="_ _9"> </span><span class="ff4 ls4 ws4">24<span class="_ _7"> </span></span>位,这是因为每种颜色的索引要用<span class="_ _9"> </span><span class="ff4 ls4 ws4">24<span class="_ _9"> </span></span>位<span class="ff4">(</span>因为总共</div><div class="t m0 x1 h6 y4b ff1 fs2 fc0 sc1 ls0 ws0">有<span class="_ _1"> </span><span class="ff4">2</span></div><div class="t m0 x1e he y4c ff4 fs4 fc0 sc1 lsf ws11">24</div><div class="t m0 x1f h6 y4b ff1 fs2 fc0 sc1 ls0 ws0">种颜色,<span class="_ _8"></span>即调色板有<span class="_ _1"> </span><span class="ff4">2</span></div><div class="t m0 x20 he y4c ff4 fs4 fc0 sc1 lsf ws11">24</div><div class="t m0 x21 h6 y4b ff1 fs2 fc0 sc1 ls0 ws0">行<span class="ff4">)</span>,<span class="_ _8"></span>和直接用<span class="_ _1"> </span><span class="ff4">R</span>,<span class="_ _0"></span><span class="ff4">G<span class="ff1">,<span class="_ _8"></span><span class="ff4">B<span class="_"> </span><span class="ff1">三个分量表示用的字节数一样,不但</span></span></span></span></div><div class="t m0 x1 h6 y4d ff1 fs2 fc0 sc1 ls0 ws0">没有任何便宜,<span class="_ _0"></span>还要加上一个<span class="_ _1"> </span><span class="ff4 ls4 ws4">256×256×25<span class="_ _0"></span>6×3<span class="_"> </span><span class="ff1 ls0 ws0">个字节的大调色板。<span class="_ _0"></span>所以真彩色图直接用<span class="_ _1"> </span><span class="ff4">R</span>、</span></span></div><div class="t m0 x1 h6 y4e ff4 fs2 fc0 sc1 ls0 ws0">G<span class="ff1">、</span>B<span class="_"> </span><span class="ff1">三个分量表示,它又叫做<span class="_ _1"> </span></span><span class="ls8 ws8">24<span class="_"> </span></span><span class="ff1">位色图。</span> </div><div class="t m0 x1 h4 y4f ff2 fs1 fc0 sc1 ls0 ws0">1.2 bmp</div><div class="c x0 y1 w2 h0"><div class="t m0 x22 h5 y4f ff3 fs1 fc0 sc0 ls3 ws3">文件格式</div></div><div class="t m0 x23 h4 y4f ff2 fs1 fc0 sc1 ls0 ws0"> </div></div><div class="pi" data-data='{"ctm":[1.611792,0.000000,0.000000,1.611792,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/bg3.jpg"><div class="t m0 x1 h6 y50 ff1 fs2 fc0 sc1 ls0 ws0">介绍完位图和调色板的概念,下面就让我们来看一看<span class="_ _3"> </span><span class="ff4 ls4 ws4">Wind<span class="_ _0"></span>ows<span class="_ _3"> </span><span class="ff1 ls0 ws0">的位图文件</span><span class="ls10 ws12">(.bmp<span class="_ _3"> </span><span class="ff1 ls0 ws0">文件<span class="ff4">)</span>的格</span></span></span></div><div class="t m0 x1 h6 y51 ff1 fs2 fc0 sc1 ls0 ws0">式是什么样子的。<span class="ff4"> </span></div><div class="t m0 x1 h6 y52 ff4 fs2 fc0 sc1 ls10 ws12">bmp<span class="_ _7"> </span><span class="ff1 ls0 ws0">文件大体上分成四个部分,如图<span class="_ _1"> </span></span><span class="lsc wsc">1.3<span class="_"> </span><span class="ff1 ls0 ws0">所示。<span class="ff4"> </span></span></span></div><div class="t m0 x20 h7 y53 ff1 fs2 fc0 sc1 ls0 ws0">位图文件头</div><div class="c x24 y54 w7 hd"><div class="t m0 x25 h6 y14 ff4 fs2 fc0 sc1 ls5 ws5">BITMAPFILEHEADE<span class="_ _a"></span>R<span class="ls0 ws0"> </span></div></div><div class="t m0 x26 h7 y55 ff1 fs2 fc0 sc1 ls0 ws0">位图信息头</div><div class="c x24 y56 w7 hd"><div class="t m0 x27 h6 y14 ff4 fs2 fc0 sc1 ls5 ws5">BITMAPINFOHEADER<span class="_ _a"></span><span class="ls0 ws0"> </span></div></div><div class="t m0 x28 h7 y57 ff1 fs2 fc0 sc1 ls0 ws0">调色板</div><div class="c x24 y58 w7 hd"><div class="t m0 x15 h6 y14 ff4 fs2 fc0 sc1 ls6 ws6">Palette<span class="ls0 ws0"> </span></div></div><div class="t m0 x29 h7 y59 ff1 fs2 fc0 sc1 ls0 ws0">实际的位图数据</div><div class="c x24 y5a w7 hd"><div class="t m0 x2a h6 y14 ff4 fs2 fc0 sc1 ls6 ws6">ImageDate<span class="ls0 ws0"> </span></div></div><div class="c x0 y1 w2 h0"><div class="t m0 x2b h7 y5b ff1 fs2 fc0 sc0 ls0 ws0">图</div></div><div class="t m0 xf hb y5b ff2 fs2 fc0 sc1 lsc wsc">1.3<span class="ls0 ws0"> <span class="_"> </span><span class="ls5 ws5">Windows</span></span></div><div class="c x0 y1 w2 h0"><div class="t m0 x2c h7 y5b ff1 fs2 fc0 sc0 lsd wsd">位图文件结构示意图</div></div><div class="t m0 x2d h6 y5b ff4 fs2 fc0 sc1 ls0 ws0"> </div><div class="t m0 x1 hb y5c ff1 fs2 fc0 sc1 ls0 ws0">第一部分为位图文件头<span class="_ _1"> </span><span class="ff2 ls6 ws6">BITMAPFILEHEAD<span class="_ _0"></span>ER<span class="ff1 ls0 ws0">,是一个结构,其定义如下:<span class="ff4"> </span></span></span></div><div class="t m0 x1 h6 y5d ff4 fs2 fc0 sc1 ls5 ws6">typedef st<span class="_ _a"></span>ruct tagBITMAPFIL<span class="_ _a"></span>EHEADER <span class="ls0 ws0">{ </span></div><div class="t m0 x1 h6 y5e ff4 fs2 fc0 sc1 ls5 ws5">WORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls4 ws4">bfType; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y5f ff4 fs2 fc0 sc1 ls5 ws5">DWORD <span class="_"> </span><span class="ls0 ws0"> <span class="_ _d"> </span><span class="ls6 ws6">bfSize; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y60 ff4 fs2 fc0 sc1 ls5 ws5">WORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">bfReserved1; <span class="_ _e"> </span></span> </span></div><div class="t m0 x1 h6 y61 ff4 fs2 fc0 sc1 ls5 ws5">WORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">bfReserved2; <span class="_ _e"> </span></span> </span></div><div class="t m0 x1 h6 y62 ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="ws13"> </span> <span class="_"> </span></span>bfOffBits; <span class="_"> </span><span class="ls0 ws0"> </span></div><div class="t m0 x1 h6 y63 ff4 fs2 fc0 sc1 ls5 ws8">} BITMAPFILEHE<span class="_ _a"></span>ADER; <span class="_"> </span><span class="ls0 ws0"> </span></div><div class="t m0 x1 h6 y64 ff1 fs2 fc0 sc1 ls0 ws0">这个结构的长度是固定的,<span class="_ _2"></span>为<span class="_ _1"> </span><span class="ff4 ls4 ws4">14<span class="_"> </span></span><span class="ls9 ws9">个字节<span class="ff4 ls5 ws5">(WORD<span class="_ _7"> </span></span></span>为无符号<span class="_ _1"> </span><span class="ff4 ls8 ws8">16<span class="_"> </span></span>位整数,<span class="_ _2"></span><span class="ff4 ls5 ws5">DWORD<span class="_"> </span><span class="ff1 ls0 ws0">为无符号<span class="_ _1"> </span></span><span class="ls4 ws4">32</span></span></div><div class="t m0 x1 h6 y65 ff1 fs2 fc0 sc1 ls0 ws0">位整数<span class="ff4">)</span>,各个域的说明如下:<span class="ff4"> </span></div><div class="t m0 x1 hb y66 ff2 fs2 fc0 sc1 ls5 ws5">bfType<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y67 ff1 fs2 fc1 sc1 ls0 ws0">指定文件类型,必须是<span class="_ _3"> </span><span class="ff4 ls4 ws4">0x424D</span>,即字符串“<span class="ff4 ls6 ws6">BM</span><span class="ff5">”</span><span class="fc0">,也就是说所有<span class="ff4 ls10 ws12">.bmp<span class="_ _f"> </span></span>文件的头两个字节</span></div><div class="t m0 x1 h6 y68 ff1 fs2 fc0 sc1 ls0 ws0">都是“<span class="ff4 ls6 ws6">BM</span><span class="ls9 ws9">”。</span><span class="ff4"> </span></div><div class="t m0 x1 hb y69 ff2 fs2 fc0 sc1 ls5 ws5">bfSize<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y6a ff1 fs2 fc0 sc1 ls0 ws0">指定文件大小,包括这<span class="_ _1"> </span><span class="ff4 ls8 ws8">14<span class="_"> </span></span>个字节。<span class="ff4"> </span></div><div class="t m0 x1 hb y6b ff2 fs2 fc0 sc1 ls5 ws5">bfReserved1</div><div class="c x0 y1 w2 h0"><div class="t m0 x2e h7 y6c ff1 fs2 fc0 sc0 ls0 ws0">,</div></div><div class="t m0 x22 hb y6c ff2 fs2 fc0 sc1 ls6 ws6">bfReserved2<span class="ls0 ws0"> <span class="_ _0"></span> <span class="_"> </span><span class="ff4"> </span></span></div><div class="t m0 x1 h6 y6d ff1 fs2 fc0 sc1 ls0 ws0">为保留字,不用考虑<span class="ff4"> </span></div><div class="t m0 x1 hb y6e ff2 fs2 fc0 sc1 ls5 ws5">bfOffBits<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y6f ff1 fs2 fc0 sc1 ls0 ws0">为从文件头到实际的位图数据的偏移字节数,即图<span class="_ _1"> </span><span class="ff4 lsc wsc">1.3<span class="_"> </span></span>中前三个部分的长度之和。<span class="ff5"> </span></div><div class="t m0 x1 h6 y70 ff4 fs2 fc0 sc1 ls0 ws0"> </div><div class="t m0 x1 hb y71 ff1 fs2 fc0 sc1 ls0 ws0">第二部分为位图信息头<span class="_ _1"> </span><span class="ff2 ls11 ws14">BITMAPINFOHEADER</span>,也是一个结构,其定义如下:<span class="ff4"> </span></div><div class="t m0 x1 h6 y72 ff4 fs2 fc0 sc1 ls5 ws6">typedef st<span class="_ _a"></span>ruct tagBITMAPINFOHE<span class="_ _a"></span>ADER{<span class="ls0 ws0"> </span></div><div class="t m0 x1 h6 y73 ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biSize; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y74 ff4 fs2 fc0 sc1 ls5 ws5">LONG<span class="ls0 ws0"> <span class="_"> </span><span class="ls4 ws4">biWidth; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y75 ff4 fs2 fc0 sc1 ls5 ws5">LONG<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biH<span class="ls8 ws8">eight; <span class="_"> </span></span></span> </span></div><div class="t m0 x1 h6 y76 ff4 fs2 fc0 sc1 ls5 ws5">WORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biPlanes; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y77 ff4 fs2 fc0 sc1 ls5 ws5">WORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls8 ws8">biBitC<span class="_ _a"></span>ount <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y78 ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls4 ws4">biCompress<span class="_ _0"></span>ion; <span class="_"> </span><span class="ls0 ws0"> </span></span></span></div><div class="t m0 x1 h6 y79 ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biSizeImage; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y7a ff4 fs2 fc0 sc1 ls5 ws5">LONG<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biXPelsPerMeter<span class="_ _0"></span>; <span class="_"> </span><span class="ls0 ws0"> </span></span></span></div></div><div class="pi" data-data='{"ctm":[1.611792,0.000000,0.000000,1.611792,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/bg4.jpg"><div class="t m0 x1 h6 y7b ff4 fs2 fc0 sc1 ls5 ws5">LONG<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biYPelsPerMeter<span class="_ _0"></span>; <span class="_"> </span><span class="ls0 ws0"> </span></span></span></div><div class="t m0 x1 h6 y7c ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biClrUsed; <span class="_"> </span></span> </span></div><div class="t m0 x1 h6 y7d ff4 fs2 fc0 sc1 ls5 ws5">DWORD<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 ws6">biClrImportant;<span class="_ _0"></span> <span class="_"> </span><span class="ls0 ws0"> </span></span></span></div><div class="t m0 x1 h6 y7e ff4 fs2 fc0 sc1 ls5 ws8">} BITMAPINFOHEA<span class="_ _a"></span>DER; <span class="_"> </span><span class="ls0 ws0"> </span></div><div class="t m0 x1 h6 y7f ff1 fs2 fc0 sc1 ls0 ws0">这个结构的长度是固定的,为<span class="_ _1"> </span><span class="ff4 ls8 ws8">40<span class="_"> </span></span><span class="ls9 ws9">个字节</span><span class="ff4">(<span class="ls5 ws5">LONG<span class="_ _7"> </span></span></span>为<span class="_ _1"> </span><span class="ff4 ls8 ws8">32<span class="_"> </span></span>位整数<span class="ff4">)</span>,各个域的说明如下:<span class="ff4"> </span></div><div class="t m0 x1 hb y80 ff2 fs2 fc0 sc1 ls5 ws5">biSize<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y81 ff1 fs2 fc0 sc1 ls0 ws0">指定这个结构的长度,为<span class="_ _1"> </span><span class="ff4 ls4 ws4">40</span>。<span class="ff4"> </span></div><div class="t m0 x1 hb y82 ff2 fs2 fc0 sc1 ls5 ws5">biWidth<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y83 ff1 fs2 fc0 sc1 ls0 ws0">指定图象的宽度,单位是象素。<span class="ff4"> </span></div><div class="t m0 x1 hb y84 ff2 fs2 fc0 sc1 ls6 ws6">biHeight<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y85 ff1 fs2 fc0 sc1 ls0 ws0">指定图象的高度,单位是象素。<span class="ff4"> </span></div><div class="t m0 x1 hb y86 ff2 fs2 fc0 sc1 ls6 ws6">biPlanes<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y87 ff1 fs2 fc0 sc1 ls0 ws0">必须是<span class="_ _1"> </span><span class="ff4">1</span>,不用考虑。<span class="ff4"> </span></div><div class="t m0 x1 hb y88 ff2 fs2 fc0 sc1 ls5 ws5">biBitCount <span class="_"> </span><span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y89 ff1 fs2 fc0 sc1 ls0 ws0">指定表示颜色时要用到的位数,<span class="_ _0"></span>常用的值为<span class="_ _1"> </span><span class="ff4 ls4 ws4">1(</span>黑白二色图<span class="ff4 ls5 ws8">), 4(16<span class="_"> </span></span><span class="ls9 ws9">色图<span class="ff4 ls4 ws6">), 8(256<span class="_"> </span></span></span>色<span class="ff4 ls4 ws15">), 24(</span>真彩色</div><div class="t m0 x1 h6 y8a ff1 fs2 fc0 sc1 ls0 ws0">图<span class="ff4 ls5 ws5">)(</span>新的<span class="ff4 ls9 ws9">.bmp<span class="_ _7"> </span></span>格式支持<span class="_ _1"> </span><span class="ff4 ls8 ws8">32<span class="_"> </span></span>位色,这里就不做讨论了<span class="ff4">)</span>。<span class="ff4"> </span></div><div class="t m0 x1 hb y8b ff2 fs2 fc0 sc1 ls5 ws5">biCompressio<span class="_ _a"></span>n<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y8c ff1 fs2 fc0 sc1 ls0 ws0">指定位图是否压缩,有效的值为<span class="_ _f"> </span><span class="ff4 ls6 ws6">BI<span class="_ _0"></span>_RGB<span class="ff1 ls0 ws0">,</span><span class="lsa wsa">BI_RLE8<span class="ff1 ls0 ws0">,</span></span>BI_RLE4<span class="ff1 ls0 ws0">,</span><span class="ls5 ws5">BI_BITFIELDS(<span class="ff1 ls0 ws0">都是一些</span></span></span></div><div class="t m0 x1 h6 y8d ff4 fs2 fc0 sc1 ls4 ws4">Windows<span class="_"> </span><span class="ff1 ls0 ws0">定义好的常量<span class="ff4">)<span class="_ _0"></span><span class="ff1">。<span class="_ _10"></span>要说明的是,<span class="_ _10"></span><span class="ff4 ls4 ws4">Windows<span class="_ _e"> </span><span class="ff1 ls0 ws0">位图可以采用<span class="_ _1"> </span></span><span class="lsa wsa">RLE4<span class="ff1 ls12 ws16">,和<span class="_ _11"> </span></span><span class="ls13 ws17">RLE8<span class="_"> </span><span class="ff1 ls0 ws0">的压缩格式,</span></span></span></span></span></span></span></div><div class="t m0 x1 h6 y8e ff1 fs2 fc0 sc1 ls0 ws0">但用的不多。<span class="_ _0"></span>我们今后所讨论的只有第一种不压缩的情况,<span class="_ _0"></span>即<span class="_ _1"> </span><span class="ff4 ls6 ws6">biCompression<span class="_"> </span></span>为<span class="_ _e"> </span><span class="ff4 ls6 ws6">BI_RGB<span class="_"> </span></span>的</div><div class="t m0 x1 h6 y8f ff1 fs2 fc0 sc1 ls0 ws0">情况。<span class="ff4"> </span></div><div class="t m0 x1 hb y90 ff2 fs2 fc0 sc1 ls5 ws5">biSizeImag<span class="_ _a"></span>e<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y91 ff1 fs2 fc0 sc1 ls0 ws0">指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:<span class="ff4"> </span></div><div class="t m0 x2f h8 y92 ff4 fs3 fc0 sc1 ls14 ws18">biSizeIm<span class="_ _0"></span>age<span class="fc1">=biWidth’ </span><span class="ls0 ws0">× biHeight </span></div><div class="t m0 x1 h6 y93 ff1 fs2 fc0 sc1 ls0 ws0">要注意的是:上述公式中的<span class="_ _1"> </span><span class="ff4 ls8 ws8">biWidth’</span>必须是<span class="_ _1"> </span><span class="ff4">4<span class="_"> </span></span>的整倍数<span class="ff4">(</span>所以不是<span class="_ _1"> </span><span class="ff4 ls8 ws8">bi<span class="_ _a"></span>Width</span>,而是<span class="_ _1"> </span><span class="ff4 ls8 ws8">biWidt<span class="_ _a"></span>h’</span>,</div><div class="t m0 x1 h6 y94 ff1 fs2 fc0 sc1 ls15 ws19">表示大于或等于<span class="_ _b"> </span><span class="ff4 ls8 ws8">b<span class="_ _a"></span>iWidth<span class="_ _11"> </span></span>的,最接近<span class="_ _b"> </span><span class="ff4 ls0 ws0">4<span class="_ _11"> </span></span>的整倍数。举个例子,如果<span class="_ _12"> </span><span class="ff4 ls4 ws4">biWidth=2<span class="_ _0"></span>40<span class="_ _13"></span><span class="ff1 ls16 ws1a">,则</span></span></div><div class="t m0 x1 h6 y95 ff4 fs2 fc0 sc1 ls4 ws4">biWidth’=<span class="_ _0"></span>240<span class="ff1 ls0 ws0">;如果<span class="_ _e"> </span></span><span class="ls8 ws8">b<span class="_ _a"></span>iWidth=241<span class="_ _a"></span><span class="ff1 ls0 ws0">,</span></span>biWidth’=<span class="_ _0"></span>244)<span class="ff1 ls0 ws0">。<span class="ff4"> </span></span></div><div class="t m0 x1 h6 y96 ff1 fs2 fc0 sc1 ls0 ws0">如果<span class="_ _1"> </span><span class="ff4 ls6 ws6">biCompressio<span class="_ _0"></span>n<span class="_"> </span><span class="ff1 ls0 ws0">为<span class="_ _1"> </span></span>BI_RGB<span class="ff1 ls0 ws0">,则该项可能为零<span class="ff4"> </span></span></span></div><div class="t m0 x1 hb y97 ff2 fs2 fc0 sc1 ls6 ws6">biXPelsPerMet<span class="_ _0"></span>er<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y98 ff1 fs2 fc0 sc1 ls7 ws7">指定目标设备的水平分辨率,<span class="_ _0"></span>单位是每米的象素个数,关于分辨<span class="_ _0"></span>率的概念,我们将在第<span class="_ _b"> </span><span class="ff4 ls0 ws0">4</span></div><div class="t m0 x1 h6 y99 ff1 fs2 fc0 sc1 ls0 ws0">章详细介绍。<span class="ff4"> </span></div><div class="t m0 x1 hb y9a ff2 fs2 fc0 sc1 ls6 ws6">biYPelsPerMet<span class="_ _0"></span>er<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y9b ff1 fs2 fc0 sc1 ls0 ws0">指定目标设备的垂直分辨率,单位同上。<span class="ff4"> </span></div><div class="t m0 x1 hb y9c ff2 fs2 fc0 sc1 ls6 ws6">biClrUsed<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 y9d ff1 fs2 fc0 sc1 ls0 ws0">指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为<span class="_ _1"> </span><span class="ff4">2</span></div><div class="t m0 x30 he y9e ff4 fs4 fc0 sc1 lsf ws11">biBitCou<span class="ls17 ws1b">nt</span></div><div class="t m0 x31 h6 y9f ff1 fs2 fc0 sc1 ls0 ws0">。<span class="ff4"> </span></div><div class="t m0 x1 hb ya0 ff2 fs2 fc0 sc1 ls5 ws5">biClrImpor<span class="_ _a"></span>tant<span class="ff4 ls0 ws0"> </span></div><div class="t m0 x1 h6 ya1 ff1 fs2 fc0 sc1 ls0 ws0">指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。<span class="ff4"> </span></div></div><div class="pi" data-data='{"ctm":[1.611792,0.000000,0.000000,1.611792,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624ff0706caf596192f83b72/bg5.jpg"><div class="t m0 x1 hb y50 ff1 fs2 fc0 sc1 ls0 ws0">第三部分为调色板<span class="_ _1"> </span><span class="ff2 ls5 ws5">Palette</span>,<span class="_ _0"></span>当然,<span class="_ _8"></span>这里是对那些需要调色板的位图文件而言的。<span class="_ _0"></span>有些位图,</div><div class="t m0 x1 h6 y51 ff1 fs2 fc0 sc1 ls0 ws0">如真彩色图,前面已经讲过,是不需要调色板的,<span class="ff4 ls5 ws5">BITMAPINFOHEADE<span class="_ _a"></span>R<span class="_ _f"> </span></span>后直接是位图数</div><div class="t m0 x1 h6 y52 ff1 fs2 fc0 sc1 ls0 ws0">据。<span class="ff4"> </span></div><div class="t m0 x1 h6 ya2 ff1 fs2 fc0 sc1 ls0 ws0">调色板实际上是一个数组,<span class="_ _4"></span>共有<span class="_ _e"> </span><span class="ff4 ls5 ws5">b<span class="_ _a"></span>iClrUsed<span class="_"> </span></span>个元素<span class="ff4">(</span>如果该值为零,<span class="_ _4"></span>则有<span class="_ _1"> </span><span class="ff4">2</span></div><div class="t m0 x32 he ya3 ff4 fs4 fc0 sc1 lsf ws11">biBitCou<span class="_ _0"></span>nt</div><div class="t m0 x33 h6 ya4 ff1 fs2 fc0 sc1 ls0 ws0">个元素<span class="ff4">)</span><span class="ls18 ws1c">。数</span></div><div class="t m0 x1 h6 ya5 ff1 fs2 fc0 sc1 ls0 ws0">组中每个元素的类型是一个<span class="_ _1"> </span><span class="ff4 ls5 ws5">RGBQUAD<span class="_"> </span></span>结构,占<span class="_ _1"> </span><span class="ff4">4<span class="_"> </span></span>个字节,其定义如下:<span class="ff4"> </span></div><div class="t m0 x1 h6 ya6 ff4 fs2 fc0 sc1 ls6 wsd">typedef struct tagRGBQ<span class="_ _0"></span><span class="ls5 ws8">UAD { <span class="_"> </span><span class="ls0 ws0"> </span></span></div><div class="t m0 x1 h6 ya7 ff4 fs2 fc0 sc1 ls5 ws5">BYTE<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 wsd">rgbBlue; //</span><span class="ff1">该颜色的蓝色分量</span> </span></div><div class="t m0 x1 h6 ya8 ff4 fs2 fc0 sc1 ls5 ws5">BYTE<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 wsd">rgbGreen; //</span><span class="ff1">该颜色的绿色分量</span> </span></div><div class="t m0 x1 h6 ya9 ff4 fs2 fc0 sc1 ls5 ws5">BYTE<span class="ls0 ws0"> <span class="_"> </span><span class="ls8 wsc">rgbRe<span class="_ _a"></span>d; //</span><span class="ff1">该颜色的红色分量</span> </span></div><div class="t m0 x1 h6 yaa ff4 fs2 fc0 sc1 ls5 ws5">BYTE<span class="ls0 ws0"> <span class="_"> </span><span class="ls6 wsa">rgbReserved; //<span class="ff1 ls9 ws9">保留值</span></span> </span></div><div class="t m0 x1 h6 yab ff4 fs2 fc0 sc1 ls5 ws8">} RGBQUAD; <span class="_"> </span><span class="ls0 ws0"> </span></div><div class="t m0 x1 h7 yac ff1 fs2 fc0 sc1 ls0 ws0">第四部分就是实际的图象数据了。<span class="_ _c"></span>对于用到调色板的位图,<span class="_ _c"></span>图象数据就是该象素颜在调色板</div><div class="t m0 x1 h6 yad ff1 fs2 fc0 sc1 ls0 ws0">中的索引值。<span class="_ _5"></span>对于真彩色图,<span class="_ _5"></span>图象数据就是实际的<span class="_ _1"> </span><span class="ff4">R</span>、<span class="_ _5"></span><span class="ff4">G<span class="ff1">、<span class="_ _5"></span><span class="ff4">B<span class="_ _7"> </span><span class="ff1">值。<span class="_ _5"></span>下面针对<span class="_ _1"> </span><span class="ff4">2<span class="_"> </span></span>色、<span class="_ _5"></span><span class="ff4 ls8 ws8">16<span class="_"> </span><span class="ff1 ls0 ws0">色、<span class="_ _5"></span><span class="ff4 ls4 ws4">256</span></span></span></span></span></span></span></div><div class="t m0 x1 h6 yae ff1 fs2 fc0 sc1 ls0 ws0">色位图和真彩色位图分别介绍。<span class="ff4"> </span></div><div class="t m0 x1 h6 yaf ff1 fs2 fc0 sc1 ls0 ws0">对于<span class="_ _1"> </span><span class="ff4">2<span class="_ _7"> </span></span>色位图,用<span class="_ _7"> </span><span class="ff4">1<span class="_"> </span></span>位就可以表示该象素的颜色<span class="ff4">(</span>一般<span class="_ _7"> </span><span class="ff4">0<span class="_ _7"> </span></span>表示黑,<span class="ff4">1<span class="_"> </span></span>表示白<span class="ff4">)</span>,所以一个字节</div><div class="t m0 x1 h6 yb0 ff1 fs2 fc0 sc1 ls0 ws0">可以表示<span class="_ _1"> </span><span class="ff4">8<span class="_"> </span></span>个象素。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb1 ff1 fs2 fc0 sc1 ls0 ws0">对于<span class="_ _1"> </span><span class="ff4 ls8 ws8">16<span class="_"> </span></span>色位图,用<span class="_ _1"> </span><span class="ff4">4<span class="_"> </span></span>位可以表示一个象素的颜色,所以一个字节可以表示<span class="_ _1"> </span><span class="ff4">2<span class="_"> </span></span>个象素。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb2 ff1 fs2 fc0 sc1 ls0 ws0">对于<span class="_ _1"> </span><span class="ff4 ls8 ws8">256<span class="_"> </span></span>色位图,一个字节刚好可以表示<span class="_ _1"> </span><span class="ff4">1<span class="_"> </span></span>个象素。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb3 ff1 fs2 fc0 sc1 ls0 ws0">对于真彩色图,<span class="_ _5"></span>三个字节才能表示<span class="_ _1"> </span><span class="ff4">1<span class="_ _7"> </span></span>个象素,<span class="_ _5"></span>哇,<span class="_ _6"></span>好费空间呀!<span class="_ _6"></span>没办法,<span class="_ _6"></span>谁叫你想让图的颜</div><div class="t m0 x1 h6 yb4 ff1 fs2 fc0 sc1 ls0 ws0">色显得更亮丽呢,有得必有失嘛。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb5 ff1 fs2 fc0 sc1 ls0 ws0">要注意两点:<span class="ff4"> </span></div><div class="t m0 x1 h6 yb6 ff4 fs2 fc0 sc1 ls5 ws5">(1)<span class="fs4 ls0 ws0"> <span class="_"> </span><span class="ff1 fs2">每一行的字节数必须是<span class="_ _1"> </span><span class="ff4">4<span class="_"> </span></span>的整倍数,<span class="_ _c"></span>如果不是,<span class="_ _14"></span>则需要补齐。<span class="_ _14"></span>这在前面介绍<span class="_ _1"> </span><span class="ff4 ls6 ws6">biSizeImage</span></span></span></div><div class="t m0 x1 h6 y91 ff1 fs2 fc0 sc1 ls0 ws0">时已经提到了。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb7 ff4 fs2 fc0 sc1 ls5 ws5">(2)<span class="fs4 ls0 ws0"> <span class="_"> </span><span class="ff1 fs2">一般来说,</span></span><span class="lsa wsa">.bMP<span class="_ _3"> </span><span class="ff1 ls0 ws0">文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的</span></span></div><div class="t m0 x1 h6 y93 ff1 fs2 fc0 sc1 ls0 ws0">是图象最下面一行的左边第一个象素,<span class="_ _15"></span>然后是左边第二个象素<span class="ff4">……</span>接下来是倒数第二行左边</div><div class="t m0 x1 h6 yb8 ff1 fs2 fc0 sc1 ls0 ws0">第一个象素,左边第二个象素<span class="ff4">……</span>依次类推<span class="ff4"> <span class="_"> </span></span>,最后得到的是最上面一行的最右一个象素。<span class="ff4"> </span></div><div class="t m0 x1 h6 yb9 ff1 fs2 fc0 sc1 ls0 ws0">好了,终于介绍完<span class="_ _f"> </span><span class="ff4 ls10 ws12">bmp<span class="_ _f"> </span></span>文件结构了,是不是觉得头有些大?别着急,对照着下面的程序,</div><div class="t m0 x1 h6 yba ff1 fs2 fc0 sc1 ls0 ws0">你就会很清楚了<span class="ff4">(</span>我最爱看源程序了,呵呵<span class="ff4">)</span>。<span class="ff4"> </span></div><div class="t m0 x1 h4 ybb ff2 fs1 fc0 sc1 ls0 ws0">1.3 </div><div class="c x0 y1 w2 h0"><div class="t m0 x7 h5 ybb ff1 fs1 fc0 sc0 ls3 ws3">显示一个</div></div><div class="t m0 x34 h4 ybb ff2 fs1 fc0 sc1 ls0 ws0">bmp</div><div class="c x0 y1 w2 h0"><div class="t m0 x35 h5 ybb ff3 fs1 fc0 sc0 ls3 ws3">文件的</div></div><div class="t m0 x36 h4 ybb ff2 fs1 fc0 sc1 ls0 ws0">C</div><div class="c x0 y1 w2 h0"><div class="t m0 x37 h5 ybb ff3 fs1 fc0 sc0 ls3 ws3">程序</div></div><div class="t m0 x38 h4 ybb ff2 fs1 fc0 sc1 ls0 ws0"> </div><div class="t m0 x1 h6 ybc ff1 fs2 fc0 sc1 ls19 ws1d">下面的函数<span class="_ _b"> </span><span class="ff4 ls6 ws6">LoadBmpFile<span class="_ _3"> </span></span>,其功能是从一个<span class="ff4 ls10 ws12">.b<span class="_ _a"></span>mp<span class="_ _16"> </span></span>文件中读取数据<span class="ff4 ls0 ws0">(<span class="_ _3"> </span></span>包括</div><div class="t m0 x1 h6 ybd ff4 fs2 fc0 sc1 ls5 ws5">BITMAPINFOHEADER<span class="_ _a"></span><span class="ff1 ls0 ws0">,<span class="_ _5"></span>调色板和实际图象数据<span class="ff4">)</span>,<span class="_ _6"></span>将其存储在一个全局内存句柄<span class="_ _1"> </span><span class="ff4 ls6 ws6">hImgData</span></span></div><div class="t m0 x1 h6 ybe ff1 fs2 fc0 sc1 ls0 ws0">中,这个<span class="_ _1"> </span><span class="ff4 ls9 ws9">hI<span class="_ _a"></span>mg<span class="ls6 ws6">Data<span class="_"> </span></span></span>将在以后的图象处理程序中用到。同时填写一个类型为<span class="_ _7"> </span><span class="ff4 ls5 ws5">HBITMAP<span class="_"> </span></span>的全</div><div class="t m0 x1 h6 ybf ff1 fs2 fc0 sc1 ls1a ws1e">局变量<span class="_ _b"> </span><span class="ff4 ls6 ws6">hBitmap<span class="_ _17"> </span></span>和一个类型为<span class="_ _12"> </span><span class="ff4 lsa wsa">HPALETTE<span class="_ _17"> </span></span>的全局变量<span class="_ _b"> </span><span class="ff4 ls6 ws6">hPalette<span class="_ _a"></span></span>。这两个变量将在处理</div><div class="t m0 x1 h6 yc0 ff4 fs2 fc0 sc1 ls5 ws5">WM_PAINT<span class="_ _7"> </span><span class="ff1 ls0 ws0">消息时用到,用来显示位图。该函数的两个参数分别是用来显示位图的窗口句</span></div><div class="t m0 x1 h6 yc1 ff1 fs2 fc0 sc1 ls0 ws0">柄,和<span class="ff4 ls10 ws12">.b<span class="_ _a"></span>mp<span class="_"> </span></span>文件名<span class="ff4">(</span>全路径<span class="ff4">)</span>。当函数成功时,返回<span class="_ _1"> </span><span class="ff4 ls5 ws5">TR<span class="_ _a"></span>UE</span>,否则返回<span class="_ _1"> </span><span class="ff4 ls5 ws5">FALSE</span>。<span class="ff4"> </span></div><div class="t m0 x1 h6 yc2 ff4 fs2 fc0 sc1 ls5 ws5">BITMAPFILEHEADE<span class="_ _a"></span>R<span class="ls0 ws0"> <span class="_"> </span></span>bf;<span class="ls0 ws0"> </span></div></div><div class="pi" data-data='{"ctm":[1.611792,0.000000,0.000000,1.611792,0.000000,0.000000]}'></div></div>