⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap01.htm

📁 数字图像处理入门. 一位图像处理高手写的书. 从图像处理的最基础开始,然后慢慢以一些例子做说明,进入图像处理的更高阶段.学习图像处理不可多得的比较朴实的书
💻 HTM
📖 第 1 页 / 共 5 页
字号:
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:宋体;
&quot;Times New Roman&quot;'>章详细介绍。</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:
宋体;&quot;Times New Roman&quot;'>如果该值为零,则有</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:宋体;
&quot;Times New Roman&quot;'>。数组中每个元素的类型是一个</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:
宋体;&quot;Times New Roman&quot;'>个字节,其定义如下:</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>typedef struct tagRGBQUAD { </span></p>     
  <p style='line-height:18.0pt'>BYTE&nbsp;&nbsp;&nbsp; rgbBlue; //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>该颜色的蓝色分量</span></p>     
  <p style='line-height:18.0pt'>BYTE&nbsp;&nbsp;&nbsp; rgbGreen; //<span style='font-family:宋体;"Times New Roman";"Times New Roman"'>该颜色的绿色分量</span></p>     
  <p style='line-height:18.0pt'>BYTE&nbsp;&nbsp;&nbsp; rgbRed; //<span style='font-family:宋体;     
&quot;Times New Roman&quot;'>该颜色的红色分量</span></p>
  <p style='line-height:18.0pt'>BYTE&nbsp;&nbsp;&nbsp; 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:宋体;
&quot;Times New Roman&quot;'>、</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:
宋体;&quot;Times New Roman&quot;'>值。下面针对</span><span
lang=EN-US>2</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>色、</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:
宋体;&quot;Times New Roman&quot;'>色位图和真彩色位图分别介绍。</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:
宋体;&quot;Times New Roman&quot;'>色位图,用</span><span
lang=EN-US>1</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>位就可以表示该象素的颜色</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>一般</span><span lang=EN-US>0</span><span style='font-family:
宋体;&quot;Times New Roman&quot;'>表示黑,</span><span
lang=EN-US>1</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>表示白</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:
宋体;&quot;Times New Roman&quot;'>色位图,用</span><span
lang=EN-US>4</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>位可以表示一个象素的颜色,所以一个字节可以表示</span><span
lang=EN-US>2</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>个象素。</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:
宋体;&quot;Times New Roman&quot;'>色位图,一个字节刚好可以表示</span><span
lang=EN-US>1</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>个象素。</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"'>&nbsp;&nbsp;&nbsp; </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"'>&nbsp;&nbsp;&nbsp; </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:宋体;
&quot;Times New Roman&quot;'>接下来是倒数第二行左边第一个象素,左边第二个象素</span><span
lang=EN-US>……</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>依次类推</span> <span style='font-family:     
宋体;&quot;Times New Roman&quot;'>,最后得到的是最上面一行的最右一个象素。</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:宋体;
&quot;Times New Roman&quot;'>文件名</span><span lang=EN-US>(</span><span
style='font-family:宋体;"Times New Roman"'>全路径</span><span lang=EN-US>)</span><span style='font-family:
宋体;&quot;Times New Roman&quot;'>。当函数成功时,返回</span><span
lang=EN-US>TRUE</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>,否则返回</span><span lang=EN-US>FALSE</span><span
style='font-family:宋体;"Times New Roman"'>。</span></p>
  <p style='line-height:18.0pt'>BITMAPFILEHEADER&nbsp; 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'>{&nbsp;&nbsp; </p>
  <p style='line-height:18.0pt'>HFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hf; //<span style='font-family:宋体;
&quot;Times New Roman&quot;'>文件句柄</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>指向</span><span lang=EN-US>BITMAPINFOHEADER</span><span
style='font-family:宋体;"Times New Roman"'>结构的指针</span></p>
  <p style='line-height:18.0pt'>LPBITMAPINFOHEADER&nbsp;&nbsp;&nbsp; lpImgData; 
  </p>
  <p style='line-height:18.0pt'>LOGPALETTE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pPal; //<span
style='font-family:宋体;"Times New Roman"'>指向逻辑调色板结构的指针</span></p>
  <p style='line-height:18.0pt'>LPRGBQUAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    hPrevPalette; //<span style='font-family:宋体;
&quot;Times New Roman&quot;'>用来保存设备中原来的调色板</span></p>
  <p style='line-height:18.0pt'>HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDc; //<span
style='font-family:宋体;"Times New Roman"'>设备句柄</span></p>
  <p style='line-height:18.0pt'>HLOCAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPal; //<span
style='font-family:宋体;"Times New Roman"'>存储调色板的局部内存句柄</span></p>
  <p style='line-height:18.0pt'>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LineBytes;&nbsp; //<span style='font-family:宋体;
&quot;Times New Roman&quot;'>每一行的字节数</span></p>
  <p style='line-height:18.0pt'>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImgSize;&nbsp;&nbsp; //<span style='font-family:
宋体;&quot;Times New Roman&quot;'>实际的图象数据占用的字节数</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>实际用到的颜色数</span> <span
style='font-family:宋体;"Times New Roman"'>,即调色板数组中的颜色个数</span></p>
  <p style='line-height:18.0pt'>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumColors; </p>
  <p style='line-height:18.0pt'>DWORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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,&quot;File c:\\test.bmp not found!&quot;,&quot;Error 
    Message&quot;,</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:宋体;
&quot;Times New Roman&quot;'>打开文件错误,返回</span></p>
  <p style='line-height:18.0pt'><span

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -