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

📄 chap02.htm

📁 数字图像处理入门. 一位图像处理高手写的书. 从图像处理的最基础开始,然后慢慢以一些例子做说明,进入图像处理的更高阶段.学习图像处理不可多得的比较朴实的书
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&quot;Times New Roman&quot;'>,图象区域的</span><span lang=EN-US>y</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>height-|t<sub>y</sub>|,</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>对应原图的范围从</span><span
lang=EN-US>|t<sub>y</sub>|</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>到</span><span
lang=EN-US>height</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>;</span></p>
  <p style='line-height:18.0pt;
'> <span
lang=EN-US>(3)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp; </span></span>   
    <span
lang=EN-US>0&lt;t<sub>y</sub>&lt;height </span><span style='font-family:宋体;  
&quot;Times New Roman&quot;'>,图象区域的</span><span
lang=EN-US>y</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>范围从</span><span lang=EN-US>t<sub>y</sub></span><span
style='font-family:宋体;"Times New Roman"'>到</span><span lang=EN-US>height,</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>height-t<sub>y</sub></span><span
style='font-family:宋体;"Times New Roman"'>;</span></p>
  <p style='line-height:18.0pt;
'> <span
lang=EN-US>(4)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp; </span></span>   
    <span
lang=EN-US>t<sub>y</sub></span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>≥</span><span
lang=EN-US>height</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>memcpy</span><span
style='font-family:宋体;"Times New Roman"'>函数,从</span><span lang=EN-US>(x<sub>0</sub>,y<sub>0</sub>)</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>x<sub>1</sub></span><span
style='font-family:宋体;"Times New Roman"'>-</span><span lang=EN-US>x<sub>0</sub>)</span><span
style='font-family:宋体;"Times New Roman"'>,然后将内存指针移到</span><span lang=EN-US>(x<sub>0</sub>,y<sub>0</sub>+1)</span><span
style='font-family:宋体;"Times New Roman"'>处,拷贝下一行。这样拷贝</span><span lang=EN-US>(y<sub>1</sub>-y<sub>0</sub>)</span><span
style='font-family:宋体;"Times New Roman"'>行就完成了全部操作,避免了一个一个象素的计算,提高了效率。</span><span lang=EN-US>Translation</span><span
style='font-family:宋体;"Times New Roman"'>的源代码如下:</span></p>
  <p style='line-height:18.0pt'>int&nbsp;&nbsp;&nbsp; xOffset=0,yOffset=0;</p>  
  <p style='line-height:18.0pt'><span lang=EN-US>BOOL Translation(HWND hWnd)</span></p>
  <p style='line-height:18.0pt'><span lang=EN-US>{</span></p>
  <p style='line-height:18.0pt'>DLGPROC&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; dlgInputBox = NULL;</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; OffBits,BufSize;</p>  
  <p style='line-height:18.0pt'>LPBITMAPINFOHEADER&nbsp;&nbsp; lpImgData;</p>  
  <p style='line-height:18.0pt'>LPSTR&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;   
    lpPtr;</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; hTempImgData;</p>  
  <p style='line-height:18.0pt'>LPBITMAPINFOHEADER&nbsp;&nbsp; lpTempImgData;</p>  
  <p style='line-height:18.0pt'>LPSTR&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;   
    lpTempPtr;</p>
  <p style='line-height:18.0pt'>int&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    SrcX0,SrcY0,SrcX1,SrcY1;</p>
  <p style='line-height:18.0pt'>int&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    DstX0,DstY0,DstX1,DstY1;</p>
  <p style='line-height:18.0pt'>int&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;&nbsp;&nbsp;&nbsp;&nbsp;   
    RectWidth,RectHeight;</p>
  <p style='line-height:18.0pt'>BOOL&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;   
    xVisible,yVisible;</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;</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;&nbsp;&nbsp;&nbsp;&nbsp;   
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   
    hf;</p>
  <p style='line-height:18.0pt'>int&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;&nbsp;&nbsp;&nbsp;&nbsp;   
    i;</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>x</span><span
style='font-family:宋体;"Times New Roman"'>偏移量</span><span lang=EN-US>xOffset</span><span
style='font-family:宋体;"Times New Roman"'>,和</span><span lang=EN-US>y</span><span style='font-family:
宋体;&quot;Times New Roman&quot;'>偏移量</span><span
lang=EN-US>yOffset</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>dlgInputBox = (DLGPROC) MakeProcInstance ( (FARPROC)InputBox,ghInst 
    );</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>DialogBox (ghInst, &quot;INPUTBOX&quot;, hWnd, dlgInputBox);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>FreeProcInstance ( (FARPROC) dlgInputBox );</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//OffBits</span><span style='font-family:宋体;"Times New Roman";"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
lang=EN-US>OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER); </span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>BufSize=OffBits+bi.biHeight*LineBytes;//</span><span
style='font-family:宋体;"Times New Roman"'>要开的缓冲区的大小</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>为新产生的位图分配缓冲区内存</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>if((hTempImgData=LocalAlloc(LHND,BufSize))==NULL)</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>{</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>MessageBox(hWnd,&quot;Error alloc memory!&quot;,&quot;Error 
    Message&quot;,MB_OK|</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>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
lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//lpImgData</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为指向原来位图数据的指针</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//lpTempImgData</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为指向新产生位图数据的指针</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>lpPtr=(char *)lpImgData;</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>lpTempPtr=(char *)lpTempImgData;</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>255</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>,这样以后未处理的象素就是白色</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>memset(lpTempPtr,(BYTE)255,BufSize);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>两幅图之间的头信息,包括调色板都是相同的,所以直接拷贝头和调色板</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>memcpy(lpTempPtr,lpPtr,OffBits);</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>//xVisible</span><span style='font-family:宋体;"Times New Roman";"Times New Roman"'>为</span><span
lang=EN-US>FALSE</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>时,表示</span><span lang=EN-US>x</span><span
style='font-family:宋体;"Times New Roman"'>方向已经移出了可显示的范围</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>xVisible=TRUE; </span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>if( xOffset&lt;= -bi.biWidth )</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>xVisible=FALSE; </span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>else if( xOffset&lt;=0){</span></p>
  <p style='line-height:
18.0pt'>DstX0=0;&nbsp; //<span style='font-family:宋体;  
&quot;Times New Roman&quot;'>表示移动后,有图区域的左上角点的</span><span
lang=EN-US>x</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>坐标</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>DstX1=bi.biWidth+xOffset; //</span><span  
style='font-family:宋体;"Times New Roman"'>表示移动后,有图区域的右下角点的</span><span lang=EN-US>x</span><span
style='font-family:宋体;"Times New Roman"'>坐标</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>else if ( xOffset&lt;bi.biWidth){</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>DstX0=xOffset;</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>DstX1=bi.biWidth;</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>}</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>else</span></p>
  <p style='line-height:
18.0pt'><span lang=EN-US>xVisible=FALSE;</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>SrcX0=DstX0-xOffset; //</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>对应</span><span
lang=EN-US>DstX0</span><span style='font-family:宋体;
&quot;Times New Roman&quot;'>在原图中的</span><span lang=EN-US>x</span><span
style='font-family:宋体;"Times New Roman"'>坐标</span></p>
  <p style='line-height:18.0pt'><span
lang=EN-US>SrcX1=DstX1-xOffset; //</span><span style='font-family:宋体;  

⌨️ 快捷键说明

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