📄 chap01.htm
字号:
lang=EN-US>biWidth=241</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>,</span><span
lang=EN-US>biWidth’=244)</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>如果</span><span lang=EN-US>biCompression</span><span
style='font-family:宋体;"Times New Roman"'>为</span><span lang=EN-US>BI_RGB</span><span
style='font-family:宋体;"Times New Roman"'>,则该项可能为零</span></p>
<p style='line-height:18.0pt'><b><span
lang=EN-US>biXPelsPerMeter</span></b></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在第</span><span
lang=EN-US>4</span><span style='font-family:宋体;
"Times New Roman"'>章详细介绍。</span></p>
<p style='line-height:18.0pt'><b><span
lang=EN-US>biYPelsPerMeter</span></b></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>指定目标设备的垂直分辨率,单位同上。</span></p>
<p style='line-height:18.0pt'><b><span
lang=EN-US>biClrUsed</span></b></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为</span><span lang=EN-US>2<sup>biBitCount</sup></span><span
style='font-family:宋体;"Times New Roman"'>。</span></p>
<p style='line-height:18.0pt'><b><span
lang=EN-US>biClrImportant</span></b></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>第三部分为调色板</span><b><span lang=EN-US>Palette</span></b><span
style='font-family:宋体;"Times New Roman"'>,当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,</span><span
lang=EN-US>BITMAPINFOHEADER</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>后直接是位图数据。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>调色板实际上是一个数组,共有</span><span lang=EN-US>biClrUsed</span><span
style='font-family:宋体;"Times New Roman"'>个元素</span><span lang=EN-US>(</span><span style='font-family:
宋体;"Times New Roman"'>如果该值为零,则有</span><span
lang=EN-US>2<sup>biBitCount</sup></span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>个元素</span><span
lang=EN-US>)</span><span style='font-family:宋体;
"Times New Roman"'>。数组中每个元素的类型是一个</span><span lang=EN-US>RGBQUAD</span><span
style='font-family:宋体;"Times New Roman"'>结构,占</span><span lang=EN-US>4</span><span style='font-family:
宋体;"Times New Roman"'>个字节,其定义如下:</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>typedef struct tagRGBQUAD { </span></p>
<p style='line-height:18.0pt'>BYTE rgbBlue; //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>该颜色的蓝色分量</span></p>
<p style='line-height:18.0pt'>BYTE rgbGreen; //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>该颜色的绿色分量</span></p>
<p style='line-height:18.0pt'>BYTE rgbRed; //<span style='font-family:宋体;
"Times New Roman"'>该颜色的红色分量</span></p>
<p style='line-height:18.0pt'>BYTE rgbReserved; //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>保留值</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>} RGBQUAD; </span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的</span><span
lang=EN-US>R</span><span style='font-family:宋体;
"Times New Roman"'>、</span><span lang=EN-US>G</span><span
style='font-family:宋体;"Times New Roman"'>、</span><span lang=EN-US>B</span><span style='font-family:
宋体;"Times New Roman"'>值。下面针对</span><span
lang=EN-US>2</span><span style='font-family:宋体;
"Times New Roman"'>色、</span><span lang=EN-US>16</span><span
style='font-family:宋体;"Times New Roman"'>色、</span><span lang=EN-US>256</span><span style='font-family:
宋体;"Times New Roman"'>色位图和真彩色位图分别介绍。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>对于</span><span lang=EN-US>2</span><span style='font-family:
宋体;"Times New Roman"'>色位图,用</span><span
lang=EN-US>1</span><span style='font-family:宋体;
"Times New Roman"'>位就可以表示该象素的颜色</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>一般</span><span lang=EN-US>0</span><span style='font-family:
宋体;"Times New Roman"'>表示黑,</span><span
lang=EN-US>1</span><span style='font-family:宋体;
"Times New Roman"'>表示白</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>,所以一个字节可以表示</span><span lang=EN-US>8</span><span
style='font-family:宋体;"Times New Roman"'>个象素。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>对于</span><span lang=EN-US>16</span><span style='font-family:
宋体;"Times New Roman"'>色位图,用</span><span
lang=EN-US>4</span><span style='font-family:宋体;
"Times New Roman"'>位可以表示一个象素的颜色,所以一个字节可以表示</span><span
lang=EN-US>2</span><span style='font-family:宋体;
"Times New Roman"'>个象素。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>对于</span><span lang=EN-US>256</span><span style='font-family:
宋体;"Times New Roman"'>色位图,一个字节刚好可以表示</span><span
lang=EN-US>1</span><span style='font-family:宋体;
"Times New Roman"'>个象素。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>对于真彩色图,三个字节才能表示</span><span lang=EN-US>1</span><span
style='font-family:宋体;"Times New Roman"'>个象素,哇,好费空间呀!没办法,谁叫你想让图的颜色显得更亮丽呢,有得必有失嘛。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>要注意两点:</span></p>
<p style='line-height:18.0pt;
'> <span
lang=EN-US>(1)<span style='font:7.0pt "Times New Roman"'> </span></span>
<span
style='font-family:宋体;"Times New Roman"'>每一行的字节数必须是</span><span lang=EN-US>4</span><span
style='font-family:宋体;"Times New Roman"'>的整倍数,如果不是,则需要补齐。这在前面介绍</span><span lang=EN-US>biSizeImage</span><span
style='font-family:宋体;"Times New Roman"'>时已经提到了。</span></p>
<p style='line-height:18.0pt;
'> <span
lang=EN-US>(2)<span style='font:7.0pt "Times New Roman"'> </span></span>
<span
style='font-family:宋体;"Times New Roman"'>一般来说,</span><span lang=EN-US>.bMP</span><span
style='font-family:宋体;"Times New Roman"'>文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素</span><span
lang=EN-US>……</span><span style='font-family:宋体;
"Times New Roman"'>接下来是倒数第二行左边第一个象素,左边第二个象素</span><span
lang=EN-US>……</span><span style='font-family:宋体;
"Times New Roman"'>依次类推</span> <span style='font-family:
宋体;"Times New Roman"'>,最后得到的是最上面一行的最右一个象素。</span></p>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>好了,终于介绍完</span><span lang=EN-US>bmp</span><span
style='font-family:宋体;"Times New Roman"'>文件结构了,是不是觉得头有些大?别着急,对照着下面的程序,你就会很清楚了</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>我最爱看源程序了,呵呵</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>。</span></p>
<h2> <span
lang=EN-US>1.3</span> <span lang=EN-US> </span><a name="_Toc486331866"></a><a
name="_Toc486332866"></a><a name="_Toc486338975"></a><a name="_Toc454810840"></a><a
name="_Toc454856614"><span><span>显示一个<span lang=EN-US>bmp</span></span></span></a><span><span><span style='font-family:黑体;'>文件的</span><span lang=EN-US>C</span></span></span><span><span><span style='font-family:黑体;'>程序</span></span></span></h2>
<p style='line-height:18.0pt'><span
style='font-family:宋体;"Times New Roman"'>下面的函数</span><span lang=EN-US>LoadBmpFile</span><span
style='font-family:宋体;"Times New Roman"'>,其功能是从一个</span><span lang=EN-US>.bmp</span><span
style='font-family:宋体;"Times New Roman"'>文件中读取数据</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>包括</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>,调色板和实际图象数据</span><span lang=EN-US>)</span><span
style='font-family:宋体;"Times New Roman"'>,将其存储在一个全局内存句柄</span><span lang=EN-US>hImgData</span><span
style='font-family:宋体;"Times New Roman"'>中,这个</span><span lang=EN-US>hImgData</span><span
style='font-family:宋体;"Times New Roman"'>将在以后的图象处理程序中用到。同时填写一个类型为</span><span lang=EN-US>HBITMAP</span><span
style='font-family:宋体;"Times New Roman"'>的全局变量</span><span lang=EN-US>hBitmap</span><span
style='font-family:宋体;"Times New Roman"'>和一个类型为</span><span lang=EN-US>HPALETTE</span><span
style='font-family:宋体;"Times New Roman"'>的全局变量</span><span lang=EN-US>hPalette</span><span
style='font-family:宋体;"Times New Roman"'>。这两个变量将在处理</span><span lang=EN-US>WM_PAINT</span><span
style='font-family:宋体;"Times New Roman"'>消息时用到,用来显示位图。该函数的两个参数分别是用来显示位图的窗口句柄,和</span><span
lang=EN-US>.bmp</span><span style='font-family:宋体;
"Times New Roman"'>文件名</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>全路径</span><span lang=EN-US>)</span><span style='font-family:
宋体;"Times New Roman"'>。当函数成功时,返回</span><span
lang=EN-US>TRUE</span><span style='font-family:宋体;
"Times New Roman"'>,否则返回</span><span lang=EN-US>FALSE</span><span
style='font-family:宋体;"Times New Roman"'>。</span></p>
<p style='line-height:18.0pt'>BITMAPFILEHEADER bf;</p>
<p style='line-height:18.0pt'>BITMAPINFOHEADER bi;</p>
<p style='line-height:18.0pt'><span lang=EN-US>BOOL LoadBmpFile (HWND hWnd,char
*BmpFileName)</span></p>
<p style='line-height:18.0pt'>{ </p>
<p style='line-height:18.0pt'>HFILE
hf; //<span style='font-family:宋体;
"Times New Roman"'>文件句柄</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>指向</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构的指针</span></p>
<p style='line-height:18.0pt'>LPBITMAPINFOHEADER lpImgData;
</p>
<p style='line-height:18.0pt'>LOGPALETTE
*pPal; //<span
style='font-family:宋体;"Times New Roman"'>指向逻辑调色板结构的指针</span></p>
<p style='line-height:18.0pt'>LPRGBQUAD
lpRGB; //<span
style='font-family:宋体;"Times New Roman"'>指向</span><span lang=EN-US>RGBQUAD</span><span
style='font-family:宋体;"Times New Roman"'>结构的指针</span></p>
<p style='line-height:18.0pt'>HPALETTE
hPrevPalette; //<span style='font-family:宋体;
"Times New Roman"'>用来保存设备中原来的调色板</span></p>
<p style='line-height:18.0pt'>HDC
hDc; //<span
style='font-family:宋体;"Times New Roman"'>设备句柄</span></p>
<p style='line-height:18.0pt'>HLOCAL
hPal; //<span
style='font-family:宋体;"Times New Roman"'>存储调色板的局部内存句柄</span></p>
<p style='line-height:18.0pt'>DWORD
LineBytes; //<span style='font-family:宋体;
"Times New Roman"'>每一行的字节数</span></p>
<p style='line-height:18.0pt'>DWORD
ImgSize; //<span style='font-family:
宋体;"Times New Roman"'>实际的图象数据占用的字节数</span></p>
<p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
"Times New Roman"'>实际用到的颜色数</span> <span
style='font-family:宋体;"Times New Roman"'>,即调色板数组中的颜色个数</span></p>
<p style='line-height:18.0pt'>DWORD
NumColors; </p>
<p style='line-height:18.0pt'>DWORD
i;</p>
<p style='line-height:18.0pt'><span
lang=EN-US>if((hf=_lopen(BmpFileName,OF_READ))==HFILE_ERROR){</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,"File c:\\test.bmp not found!","Error
Message",</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>MB_OK|MB_ICONEXCLAMATION);</span></p>
<p style='line-height:
18.0pt'><span lang=EN-US>return FALSE; //</span><span style='font-family:宋体;
"Times New Roman"'>打开文件错误,返回</span></p>
<p style='line-height:18.0pt'><span
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -