圖像處理課程設(shè)計報告--基于vc++ 的簡單圖像處理_第1頁
已閱讀1頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  圖像處理</b></p><p><b>  課程設(shè)計報告</b></p><p>  不要刪除行尾的分節(jié)符,此行不會被打印</p><p> 課設(shè)題目:基于VC++ 的簡單圖像處理</p><p> 學(xué) 院:信息工程與自動化學(xué)院</p><p

2、> 專 業(yè):電子與通信工程</p><p> 班 級:2013級</p><p> 姓 名:</p><p> 學(xué) 號:</p><p> 課程教師:</p><p> 課程名稱圖像處理</p><p><b>  目 錄</b></p

3、><p>  一. 課程設(shè)計任務(wù)2</p><p>  二. 課程設(shè)計原理及設(shè)計方案3</p><p>  2.1灰度直方圖原理分析3</p><p>  2.2灰度直方圖統(tǒng)計的實現(xiàn)方法4</p><p>  2.3圖像的灰度變換原理5</p><p>  三. 課程設(shè)計的步驟和結(jié)果6&

4、lt;/p><p>  3.1類聲明與核心算法程序代碼6</p><p>  3.2直方圖均衡化過程實現(xiàn)步驟8</p><p>  3.3圖像的灰度變換實現(xiàn)步驟2</p><p>  3.4設(shè)計成果18</p><p>  四. 設(shè)計體會23</p><p>  五. 參考文獻(xiàn)24<

5、;/p><p><b>  課程設(shè)計任務(wù)</b></p><p>  編寫一個基于VC++ 的圖像處理程序/軟件,功能按鈕和界面布局自己設(shè)定,需要實現(xiàn)如下兩個功能:</p><p>  1、繪制灰度直方圖,實現(xiàn)直方圖均衡化及直方圖規(guī)定化;</p><p>  2、圖像的灰度變換(圖像求反,圖像的閾值變換,圖像的線性變換);&

6、lt;/p><p>  課程設(shè)計原理及設(shè)計方案</p><p>  直方圖是對圖像每一亮度間隔內(nèi)像元頻數(shù)的統(tǒng)計。它描繪了圖像的總概貌,給出了圖像亮度與顏色范圍、每個亮度間隔的頻數(shù)、像元依亮度分布的形態(tài)以及彩色分量的色調(diào)。但不知道某一亮度值像元出現(xiàn)的概率處于什么位置。將一幅圖像劃分成一些子圖像,整個圖像的直方圖等于各個子圖像的直方圖之和,不同的圖像可能具有相同的直方圖。利用直方圖可檢驗輸入圖像亮

7、度值在量化范圍內(nèi)是否分配得恰當(dāng),圖像數(shù)字化后的灰度級與實際占用灰度級的提高了很多,有很好的對比度。</p><p>  試開發(fā)一個圖像直方圖處理軟件,要求如下:</p><p>  1.菜單式的人機界面。</p><p>  2.具有文件處理功能。</p><p>  3.對圖像進行灰度變換。</p><p>  圖像

8、直方圖處理部分應(yīng)具有直方圖均衡化(非適應(yīng)性直方圖修正)和直方圖規(guī)定化(適應(yīng)性直方圖修正)兩個模塊。</p><p>  圖像的灰度變換包括圖像求反,圖像的閾值變換,圖像的線性變換。</p><p>  2.1灰度直方圖原理分析</p><p><b>  1、灰度直方圖 </b></p><p>  直方像圖反映了圖的像

9、素的灰度分布是反映一幅圖像中的灰度級與出現(xiàn)這種灰度級的像素的概率之間關(guān)系的圖形。</p><p>  直方圖的橫坐標(biāo)為灰度級(用r表示),縱坐標(biāo)是具有該灰度級的像素個數(shù)或出現(xiàn)此灰度級的概率P(rk)。</p><p>  設(shè)N(=a×b)為一幅圖像中像素總數(shù),nk為第k級灰度的像素數(shù);r k表示第k個灰度級。則:</p><p>  P(rk)= nk /

10、N (歸一化后k級灰度像素數(shù))</p><p>  定義:反映各灰度級出現(xiàn)頻數(shù)的分布情況,進而反映圖像對(清晰)度,但不反映各灰度級的空間位置分布。</p><p>  圖像的(灰度統(tǒng)計)直方圖是一個一維的離散函數(shù)。它的定義為:設(shè)sk為圖像f(x,y)的第k級灰度值,nk是f(x,y)中具有灰度值sk的象素的個數(shù),n是圖像象素總數(shù),則:ps(sk)= nk/n k=0,1,,L

11、-1稱為圖像f(x,y)的直方圖。這里ps(sk)代表原始圖中第k個灰度級的出現(xiàn)概率。以nk為自變量,以ps(sk)為函數(shù),得到的曲線就是圖像的直方圖,在實際中常常直接將對第k個灰度級的統(tǒng)計值nk作為圖像的直方圖。它提供了原圖灰度值的分布情況,也可以說給出了一幅圖所有灰度值的整體描述。</p><p>  對灰度圖像進行直方圖統(tǒng)計的程序流程圖如圖2-2所示。</p><p>  圖2-2

12、 灰度圖像直方圖統(tǒng)計流程</p><p><b>  2、直方圖均衡化</b></p><p>  如上面所述,一幅給定的圖像的灰度級分布在0≤ r ≤1范圍內(nèi)??梢詫0, 1]區(qū)間內(nèi)的任一個 r 值進行如下變換 也就是說,通過上述變換,每個原始圖像的像素灰度值 r 都對應(yīng)產(chǎn)生一個 s 值。 </p><p>  變換

13、函數(shù)T(r)應(yīng)滿足下列條件:</p><p> ?。?)在0≤r≤1區(qū)間內(nèi),T(r)單值單調(diào)增加;</p><p>  (2)對于0≤r≤1,有0≤T(r)≤1。</p><p>  這里的第一個條件保證了圖像的灰度級從白到黑的次序不變。第二個條件則保證了映射變換后的像素灰度值在允許的范圍內(nèi)。</p><p><b>  3、直方圖

14、規(guī)定化</b></p><p>  希望能夠有目的地增強某個灰度區(qū)間的圖像, 即能夠人為地修正直方圖的形狀, 使之與期望的形狀相匹配,這就是直方圖規(guī)定化的基本思想。換句話說,希望可以人為地改變直方圖形狀,使之成為某個特定的形狀,直方圖規(guī)定化就是針對上述要求提出來的一種增強技術(shù),它可以按照預(yù)先設(shè)定的某個形狀來調(diào)整圖像的直方圖。直方圖規(guī)定化是在運用均衡化原理的基礎(chǔ)上,通過建立原始圖像和期望圖像之間的關(guān)系,

15、選擇地控制直方圖,使原始圖像的直方圖變成規(guī)定的形狀,從而彌補了直方圖均衡不具備交互作用的特性。</p><p>  4、BMP圖像文件格式</p><p>  BMP圖像文件是Microsoft Windows所規(guī)定的圖像文件格式。隨著Windows的風(fēng)行全球,BMP圖像文件也就成為PC機上流行的圖像文件格式。</p><p>  BMP圖像文件具有下列六項特色。&

16、lt;/p><p>  (1)文件結(jié)構(gòu)只能存放一幅圖像。</p><p>  (2)可以存儲單色、16色、256色和全彩色四種圖像數(shù)據(jù)。</p><p> ?。?)圖像數(shù)據(jù)可選擇壓縮或不壓縮處理</p><p>  (4)Windows設(shè)計了兩種壓縮方式:RLE4和RLE8。RLE4處理16色圖像數(shù)據(jù);而RLE8則是壓縮256圖像數(shù)據(jù)。</

17、p><p> ?。?)圖像數(shù)據(jù)排列順序,與一般圖像文件有所不同。</p><p>  (6)調(diào)色板的數(shù)據(jù)結(jié)構(gòu)特殊。</p><p>  2.2灰度直方圖統(tǒng)計的實現(xiàn)方法</p><p>  直方圖均衡化過程(算法):</p><p>  (1) 列出原始圖灰度級rk;</p><p>  (2) 統(tǒng)計

18、原始直方圖各灰度級像素數(shù)nk;</p><p>  (3) 計算原始直方圖各概率:pk=nk/N;</p><p>  (4) 計算累計直方圖:sk=Σpk;</p><p>  (5) 取整Sk=int{(L-1)sk+0.5};</p><p>  (6) 確定映射對應(yīng)關(guān)系:rksk;</p><p>  (7) 

19、統(tǒng)計新直方圖各灰度級像素nk';</p><p>  (8) 用pk (sk) =nk'/N計算新直方圖。</p><p>  利用Visual C++中提供的MFC框架設(shè)計一個簡單的應(yīng)用程序框架,具有圖像顯示,圖像直方圖均衡、直方圖規(guī)定化、直方圖、直方圖均衡后圖像等菜單欄,再利用C++具有面向?qū)ο蟪绦蛟O(shè)計的性質(zhì),編寫程序代碼實現(xiàn)MFC框架中對應(yīng)菜單欄中的圖像處理的功能,即

20、可得到一個簡易的圖像處理系統(tǒng),達(dá)到課程考核題目的要求。 本次課程考核設(shè)計了一個簡單的圖片處理系統(tǒng),主要具有以對話框的形式顯示原始圖片(bmp格式)、顯示原圖像的直方圖、圖像直方圖均衡化、圖像直方圖規(guī)定化、顯示均衡化和規(guī)定化處理后的直方圖的功能。</p><p>  2.3圖像的灰度變換原理</p><p>  灰度即使用黑色調(diào)表示物體。每個灰度對象都具有從0%(白色)到100%(黑色)的亮

21、度值。灰度變換處理是圖像增強處理技術(shù)中一種非?;A(chǔ)、直接的空間域圖像處理方法,也是圖像數(shù)字化和圖像顯示的一個重要組成部分?;叶茸儞Q主要針對獨立的像素點進行處理,通過改變原始圖像數(shù)據(jù)所占有的灰度范圍而使圖像在視覺上得到改觀。</p><p>  課程設(shè)計的步驟和結(jié)果</p><p>  3.1類聲明與核心算法程序代碼</p><p><b>  // 灰度均

22、衡</b></p><p>  void CBitmapView::OnPointEqua() </p><p><b>  {</b></p><p><b>  // 獲取文檔</b></p><p>  CBitmapDoc* pDoc = GetDocument();</p

23、><p>  // 指向DIB的指針</p><p>  LPSTRlpDIB;</p><p>  // 指向DIB象素指針</p><p>  LPSTR lpDIBBits;</p><p><b>  // 鎖定DIB</b></p><p>  lpDIB =

24、 (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());</p><p>  // 找到DIB圖像象素起始位置</p><p>  lpDIBBits = ::FindDIBBits(lpDIB);</p><p>  // 判斷是否是8-bpp位圖(這里為了方便,只處理8-bpp位圖的直方圖均衡,其它的可以類推)&l

25、t;/p><p>  if (::DIBNumColors(lpDIB) != 256)</p><p><b>  {</b></p><p><b>  // 提示用戶</b></p><p>  MessageBox("目前只支持256色位圖的直方圖均衡!", "系統(tǒng)

26、提示" , </p><p>  MB_ICONINFORMATION | MB_OK);</p><p><b>  // 解除鎖定</b></p><p>  ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());</p><p><b>  // 返回<

27、/b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  // 更改光標(biāo)形狀</b></p><p>  BeginWaitCursor();</p><p>  // 調(diào)用In

28、teEqualize()函數(shù)進行直方圖均衡</p><p>  InteEqualize(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB));</p><p><b>  // 設(shè)置臟標(biāo)記</b></p><p>  pDoc->SetModifiedFlag(TRUE);</p>

29、;<p><b>  // 更新視圖</b></p><p>  pDoc->UpdateAllViews(NULL);</p><p><b>  // 解除鎖定</b></p><p>  ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());</p>

30、<p><b>  // 恢復(fù)光標(biāo)</b></p><p>  EndWaitCursor();</p><p><b>  }</b></p><p>  /********************************************************************</p&

31、gt;<p><b>  * 函數(shù)名稱:</b></p><p>  * InteEqualize()</p><p><b>  *</b></p><p><b>  * 參數(shù):</b></p><p>  * LPSTR lpDIBBits -

32、 指向源DIB圖像指針</p><p>  * LONG lWidth - 源圖像寬度(象素數(shù))</p><p>  * LONG lHeight - 源圖像高度(象素數(shù))</p><p><b>  *</b></p><p><b>  * 返回值:</b>&l

33、t;/p><p>  * BOOL - 成功返回TRUE,否則返回FALSE。</p><p><b>  *</b></p><p><b>  * 說明:</b></p><p>  * 該函數(shù)用來對圖像進行直方圖均衡。</p><p> 

34、 ************************************************************************/</p><p>  BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)</p><p>  {// 指向源圖像的指針</p><p>

35、;  unsigned char*lpSrc;// 臨時變量</p><p>  LONGlTemp; // 循環(huán)變量</p><p><b>  LONGi;</b></p><p>  LONGj; // 灰度映射表</p><p>  BYTEbMap[256]; // 灰度映射表&l

36、t;/p><p>  LONGlCount[256]; // 圖像每行的字節(jié)數(shù)</p><p>  LONGlLineBytes; // 計算圖像每行的字節(jié)數(shù)</p><p>  lLineBytes = WIDTHBYTES(lWidth * 8); // 重置計數(shù)為0</p><p>  for (i = 0; i <

37、; 256; i ++)</p><p><b>  {</b></p><p><b>  // 清零</b></p><p>  lCount[i] = 0;</p><p><b>  }</b></p><p>  // 計算各個灰度值的計數(shù)&l

38、t;/p><p>  for (i = 0; i < lHeight; i ++)</p><p><b>  {</b></p><p>  for (j = 0; j < lWidth; j ++)</p><p><b>  {</b></p><p>  lp

39、Src = (unsigned char *)lpDIBBits + lLineBytes * i + j;</p><p><b>  // 計數(shù)加1</b></p><p>  lCount[*(lpSrc)]++;</p><p><b>  }</b></p><p><b>  

40、}</b></p><p>  // 計算灰度映射表</p><p>  for (i = 0; i < 256; i++)</p><p><b>  {// 初始為0</b></p><p>  lTemp = 0;</p><p>  for (j = 0; j <=

41、 i ; j++)</p><p><b>  {</b></p><p>  lTemp += lCount[j];</p><p>  } // 計算對應(yīng)的新灰度值</p><p>  bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth);</p>&l

42、t;p><b>  }</b></p><p><b>  // 每行</b></p><p>  for(i = 0; i < lHeight; i++)</p><p><b>  {// 每列</b></p><p>  for(j = 0; j < l

43、Width; j++)</p><p><b>  {</b></p><p>  // 指向DIB第i行,第j個象素的指針</p><p>  lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;</p><p>  // 計算新

44、的灰度值</p><p>  *lpSrc = bMap[*lpSrc];</p><p><b>  }</b></p><p><b>  }// 返回</b></p><p>  return TRUE;</p><p><b>  }</b>&l

45、t;/p><p>  3.2直方圖均衡化過程實現(xiàn)步驟</p><p>  根據(jù)BMP圖像文件的基本格式,利用VC編寫8bits無壓縮BMP圖像文件的打開和存儲的程序;編寫對灰度圖像進行直方圖統(tǒng)計的程序,并將結(jié)果顯示在屏幕上。</p><p><b>  1、總體流程圖</b></p><p><b>  2、參考步

46、驟和程序</b></p><p>  打開VC程序——文件——新建——工程中的MFC AppWizard(exe),在工程下面的框中輸入工程名(假定工程名為111),點確定——選多重文檔,點下一個——后面都點下一個直到完成確定,基本框架就完成了,下面就加代碼。</p><p>  這時VC界面上左邊框的下面有三個按鈕:ClassView、ResourceView和FileVie

47、w,ClassView里面是工程111的類:CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;點ResourceView里面是資源類:Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version;點開FileView里面是文件類:Source File、Header Files、Resource Files和Re

48、adMe.txt。</p><p>  點界面的“工程”按鈕——添加工程——新建——選C++ Source File,在文件下面的框里輸入文件名(如DIBAPI),點“結(jié)束”,這樣在FileView中的Source Files里面就多了一個DIBAPI.cpp文件,所有的代碼都加在該文件中。再點界面的“工程”按鈕——添加工程——新建——選C/C++ Header File,在文件下面的框里輸入文件名(和前面的文件

49、名必須一致),點“結(jié)束”,這樣在FileView中的Header Files里面就多了一個DIBAPI.h文件,該文件是DIBAPI.cpp的頭文件。</p><p>  點開DIBAPI.h文件,里面是空白的,把如下代碼考入文件中:</p><p>  //DIBAPI.h</p><p>  #ifndef _INC_DIBAPI</p><

50、p>  #define _INC_DIBAPI</p><p>  DECLARE_HANDLE(HDIB);</p><p>  #define PALVERSION 0x300</p><p>  #define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))</

51、p><p>  #define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left)</p><p>  #define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top)</p><p>  #define WIDTHBYTES(

52、bits) (((bits)+31)/32*4)</p><p>  #define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B')</p><p>  BOOL WINAPI PaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette* pPal);</p><

53、p>  BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* cPal);</p><p>  LPSTR WINAPI FindDIBBits(LPSTR lpbi);</p><p>  DWORD WINAPI DIBWidth(LPSTR lpDIB);</p><p>  DWORD WINAPI DIBH

54、eight(LPSTR lpDIB);</p><p>  WORD WINAPI PaletteSize(LPSTR lpbi);</p><p>  WORD WINAPI DIBNumColors(LPSTR lpbi);</p><p>  HGLOBAL WINAPI CopyHandle(HGLOBAL h);</p><p> 

55、 BOOL WINAPI SaveDIB(HDIB hDib,CFile& file);</p><p>  HDIB WINAPI ReadDIBFile(CFile& file);</p><p>  //在此處輸入自己的函數(shù)聲明</p><p>  #endif//!_INC_DIBAPI</p><p>  上面這些函

56、數(shù)是實現(xiàn)圖像的讀取、存儲等圖像處理的基本功能的,你將自己需要的函數(shù)也輸入到“//在此處輸入自己的函數(shù)聲明”的下面。</p><p>  點開DIBAPI.cpp文件,里面是空白的,將如下代碼加入其中:</p><p>  //DIBAPI.cpp</p><p>  #include "stdafx.h"</p><p>

57、  #include "DIBAPI.h"</p><p>  WORD WINAPI DIBNumColors(LPSTR lpbi)</p><p><b>  {</b></p><p>  WORD wBitCount;</p><p>  if(IS_WIN30_DIB(lpbi))<

58、/p><p><b>  {</b></p><p>  DWORD dwClrUsed;</p><p>  dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;</p><p>  if(dwClrUsed)</p><p>  return (W

59、ORD)dwClrUsed;</p><p><b>  }</b></p><p>  if(IS_WIN30_DIB(lpbi))</p><p>  wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;</p><p><b>  else</b&

60、gt;</p><p>  wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;</p><p>  switch(wBitCount)</p><p><b>  {</b></p><p><b>  case 1:</b></p>

61、<p><b>  return 2;</b></p><p><b>  case 4:</b></p><p>  return 16;</p><p><b>  case 8:</b></p><p>  return 256;</p>&l

62、t;p><b>  default:</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  WORD WINAPI PaletteSize(

63、LPSTR lpbi)</p><p><b>  {</b></p><p>  if(IS_WIN30_DIB(lpbi))</p><p>  return (WORD)(DIBNumColors(lpbi)*sizeof(RGBQUAD));</p><p><b>  else</b>&l

64、t;/p><p>  return (WORD)(DIBNumColors(lpbi)*sizeof(RGBTRIPLE));</p><p><b>  }</b></p><p>  LPSTR WINAPI FindDIBBits(LPSTR lpbi)</p><p><b>  {</b>&l

65、t;/p><p>  return (lpbi+*(LPDWORD)lpbi+::PaletteSize(lpbi));</p><p><b>  }</b></p><p>  DWORD WINAPI DIBWidth(LPSTR lpDIB)</p><p><b>  {</b></p&

66、gt;<p>  LPBITMAPINFOHEADER lpbmi;</p><p>  LPBITMAPCOREHEADER lpbmc;</p><p>  lpbmi=(LPBITMAPINFOHEADER)lpDIB;</p><p>  lpbmc=(LPBITMAPCOREHEADER)lpDIB;</p><p>

67、  if(IS_WIN30_DIB(lpDIB))</p><p>  return lpbmi->biWidth;</p><p><b>  else</b></p><p>  return (DWORD)lpbmc->bcWidth;</p><p><b>  }</b><

68、;/p><p>  DWORD WINAPI DIBHeight(LPSTR lpDIB)</p><p><b>  {</b></p><p>  LPBITMAPINFOHEADER lpbmi;</p><p>  LPBITMAPCOREHEADER lpbmc;</p><p>  lpb

69、mi=(LPBITMAPINFOHEADER)lpDIB;</p><p>  lpbmc=(LPBITMAPCOREHEADER)lpDIB;</p><p>  if(IS_WIN30_DIB(lpDIB))</p><p>  return lpbmi->biHeight;</p><p><b>  else</

70、b></p><p>  return (DWORD)lpbmc->bcHeight;</p><p><b>  }</b></p><p>  BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal)</p

71、><p><b>  {</b></p><p>  LPSTR lpDIBHdr;</p><p>  LPSTR lpDIBBits;</p><p>  BOOL bSuccess=FALSE;</p><p>  HPALETTE hPal=NULL;</p><p>

72、  HPALETTE hOldPal=NULL;</p><p>  if(hDIB==NULL)</p><p>  return FALSE;</p><p>  lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB);</p><p>  lpDIBBits=FindDIBBits(lpDIBHdr);&

73、lt;/p><p>  if(pPal!=NULL)</p><p><b>  {</b></p><p>  hPal=(HPALETTE)pPal->m_hObject;</p><p>  hOldPal=::SelectPalette(hDC,hPal,TRUE);</p><p>&

74、lt;b>  }</b></p><p>  ::SetStretchBltMode(hDC,COLORONCOLOR);</p><p>  if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))</p>&

75、lt;p><b>  {</b></p><p>  bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\</p><p>  (int)DIBHeight(

76、lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\</p><p>  lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);</p><p><b>  }</b></p><p><b

77、>  else</b></p><p><b>  {</b></p><p>  bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\</p>

78、;<p>  lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\</p><p>  lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);</p><p><b>  }</b></p><p>

79、  ::GlobalUnlock((HGLOBAL)hDIB);</p><p>  if(hOldPal)</p><p>  ::SelectPalette(hDC,hOldPal,TRUE);</p><p>  GlobalUnlock(hDIB);</p><p>  return bSuccess;</p><

80、p><b>  }</b></p><p>  BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette* pPal)</p><p><b>  {</b></p><p>  LPLOGPALETTE lpPal;</p><p>  HANDLE h

81、LogPal;</p><p>  HPALETTE hPal=NULL;</p><p>  LPSTR lpbi;</p><p>  LPBITMAPINFO lpbmi;</p><p>  LPBITMAPCOREINFO lpbmc;</p><p>  BOOL bWinStyleDIB;</p&g

82、t;<p><b>  int i;</b></p><p>  WORD wNumColors;</p><p>  BOOL bResult=FALSE;</p><p>  if(hDIB==NULL)</p><p>  return FALSE;</p><p>  lpb

83、i=(LPSTR)::GlobalLock((HGLOBAL)hDIB);</p><p>  lpbmi=(LPBITMAPINFO)lpbi;</p><p>  lpbmc=(LPBITMAPCOREINFO)lpbi;</p><p>  wNumColors=DIBNumColors(lpbi);</p><p>  bWinSty

84、leDIB=IS_WIN30_DIB(lpbi);</p><p>  if(wNumColors!=0)</p><p><b>  {</b></p><p>  hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)*wNumColors);</p>

85、<p>  if(hLogPal==0)</p><p><b>  {</b></p><p>  ::GlobalUnlock((HGLOBAL)hDIB);</p><p>  return FALSE;</p><p><b>  }</b></p><p&

86、gt;  lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);</p><p>  lpPal->palVersion=PALVERSION;</p><p>  lpPal->palNumEntries=(WORD)wNumColors;</p><p>  bWinStyleDIB=IS_WIN30_DIB(lpbi)

87、;</p><p>  for(i=0;i<(int)wNumColors;i++)</p><p><b>  {</b></p><p>  if(bWinStyleDIB)</p><p><b>  {</b></p><p>  lpPal->palPa

88、lEntry[i].peRed=lpbmi->bmiColors[i].rgbRed;</p><p>  lpPal->palPalEntry[i].peGreen=lpbmi->bmiColors[i].rgbGreen;</p><p>  lpPal->palPalEntry[i].peBlue=lpbmi->bmiColors[i].rgbBlue;

89、</p><p>  lpPal->palPalEntry[i].peFlags=0;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  lpPal-&

90、gt;palPalEntry[i].peRed=lpbmc->bmciColors[i].rgbtRed;</p><p>  lpPal->palPalEntry[i].peGreen=lpbmc->bmciColors[i].rgbtGreen;</p><p>  lpPal->palPalEntry[i].peBlue=lpbmc->bmciColor

91、s[i].rgbtBlue;</p><p>  lpPal->palPalEntry[i].peFlags=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  bResult=pPal->CreatePalette(lpPal);&

92、lt;/p><p>  ::GlobalUnlock((HGLOBAL)hLogPal);</p><p>  ::GlobalFree((HGLOBAL)hLogPal);</p><p><b>  }</b></p><p>  ::GlobalUnlock((HGLOBAL)hDIB);</p><

93、;p>  return bResult;</p><p><b>  }</b></p><p>  HGLOBAL WINAPI CopyHandle(HGLOBAL h)</p><p><b>  {</b></p><p>  if(h==NULL)</p><p&

94、gt;  return NULL;</p><p>  DWORD dwLen=::GlobalSize((HGLOBAL)h);</p><p>  HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);</p><p>  if(hCopy!=NULL)</p><p><b>  {</b>

95、;</p><p>  void* lpCopy=::GlobalLock((HGLOBAL)hCopy);</p><p>  void* lp=::GlobalLock((HGLOBAL)h);</p><p>  memcpy(lpCopy,lp,dwLen);</p><p>  ::GlobalUnlock(hCopy);</

96、p><p>  ::GlobalUnlock(h);</p><p><b>  }</b></p><p>  return hCopy;</p><p><b>  }</b></p><p>  BOOL WINAPI SaveDIB(HDIB hDib,CFile&

97、; file)</p><p><b>  {</b></p><p>  BITMAPFILEHEADER bmfHdr;</p><p>  LPBITMAPINFOHEADER lpBI;</p><p>  DWORD dwDIBSize;</p><p><b>  if(!h

98、Dib)</b></p><p>  return FALSE;</p><p>  lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);</p><p>  if(lpBI==NULL)</p><p>  return FALSE;</p><p>

99、  if(!IS_WIN30_DIB(lpBI))</p><p><b>  {</b></p><p>  ::GlobalUnlock((HGLOBAL)hDib);</p><p>  return FALSE;</p><p><b>  }</b></p><p>

100、;  bmfHdr.bfType=DIB_HEADER_MARKER;</p><p>  dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);</p><p>  if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))</p><

101、;p>  dwDIBSize+=lpBI->biSizeImage;</p><p><b>  else</b></p><p><b>  {</b></p><p>  DWORD dwBmBitsSize;</p><p>  dwBmBitsSize=WIDTHBYTES((l

102、pBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;</p><p>  dwDIBSize+=dwBmBitsSize;</p><p>  lpBI->biSizeImage=dwBmBitsSize;</p><p><b>  }</b></p&g

103、t;<p>  bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);</p><p>  bmfHdr.bfReserved1=0;</p><p>  bmfHdr.bfReserved2=0;</p><p>  bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEAD

104、ER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI);</p><p><b>  TRY</b></p><p><b>  {</b></p><p>  file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));</p

105、><p>  file.WriteHuge(lpBI,dwDIBSize);</p><p><b>  }</b></p><p>  CATCH(CFileException,e)</p><p><b>  {</b></p><p>  ::GlobalUnlock((H

106、GLOBAL)hDib);</p><p>  THROW_LAST();</p><p><b>  }</b></p><p><b>  END_CATCH</b></p><p>  ::GlobalUnlock((HGLOBAL)hDib);</p><p>  r

107、eturn TRUE;</p><p><b>  }</b></p><p>  HDIB WINAPI ReadDIBFile(CFile& file)</p><p><b>  {</b></p><p>  BITMAPFILEHEADER bmfHeader;</p>

108、<p>  DWORD dwBitsSize;</p><p>  HDIB hDIB;</p><p>  LPSTR pDIB;</p><p>  dwBitsSize=file.GetLength();</p><p>  if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHead

109、er))!=sizeof(bmfHeader))</p><p>  return NULL;</p><p>  if(bmfHeader.bfType!=DIB_HEADER_MARKER)</p><p>  return NULL;</p><p>  hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GM

110、EM_ZEROINIT,dwBitsSize);</p><p>  if(hDIB==0)</p><p>  return NULL;</p><p>  pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);</p><p>  if(file.ReadHuge(pDIB,dwBitsSize-sizeof(B

111、ITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))</p><p><b>  {</b></p><p>  ::GlobalUnlock((HGLOBAL)hDIB);</p><p>  ::GlobalFree((HGLOBAL)hDIB);</p><p&

112、gt;  return NULL;</p><p><b>  }</b></p><p>  ::GlobalUnlock((HGLOBAL)hDIB);</p><p>  return hDIB;</p><p><b>  }</b></p><p>  //在此處輸

113、入自己的函數(shù)定義</p><p>  上面是DIBAPI.h頭文件中聲明的函數(shù)的定義,你將自己的函數(shù)定義加到“//在此處輸入自己的函數(shù)定義”后面。</p><p>  下面加相應(yīng)的消息映射函數(shù),點Ctrl+W鍵,會出現(xiàn)MFC ClassWizard對話框,點Message Maps,在Class name下面的框中選擇CMy111Doc,在Messages里面選中OnOpenDocumen

114、t,然后點擊Add Function按鈕就加入了相應(yīng)的消息映射函數(shù),同樣的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相應(yīng)的消息函數(shù),點“確定”即可。</p><p>  點開111Doc.cpp文件,里面有相應(yīng)的消息映射函數(shù)定義位置,在函數(shù)CMy111Doc::CMy111Doc()里輸入以下代碼:</p><p>  m_refCo

115、lorBKG=0x00808080;</p><p>  m_hDIB=NULL;</p><p>  m_palDIB=NULL;</p><p>  m_sizeDoc=CSize(1,1);</p><p>  在函數(shù)CMy111Doc::~CMy111Doc()里輸入以下代碼:</p><p>  if(m_h

116、DIB!=NULL)</p><p>  ::GlobalFree((HGLOBAL)m_hDIB);</p><p>  if(m_palDIB!=NULL)</p><p>  delete m_palDIB;</p><p>  在函數(shù)BOOL CMy111Doc::OnOpenDocument(LPCTSTR lpszPathName

117、)里/ TODO: Add your specialized creation code here下面添加如下代碼:</p><p>  CFile file;</p><p>  CFileException fe;</p><p>  if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite

118、,&fe))</p><p><b>  {</b></p><p>  ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);</p><p>  return FALSE;</p><p><b>

119、;  }</b></p><p>  DeleteContents();</p><p>  BeginWaitCursor();</p><p><b>  TRY</b></p><p><b>  {</b></p><p>  m_hDIB=::ReadD

120、IBFile(file);</p><p><b>  }</b></p><p>  CATCH(CFileException,eLoad)</p><p><b>  {</b></p><p>  file.Abort();</p><p>  EndWaitCurso

121、r();</p><p>  ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);</p><p>  m_hDIB=NULL;</p><p>  return FALSE;</p><p><b>  }</b>&l

122、t;/p><p><b>  END_CATCH</b></p><p>  InitDIBData();</p><p>  EndWaitCursor();</p><p>  if(m_hDIB==NULL)</p><p><b>  {</b></p>&

123、lt;p>  CString strMsg;</p><p>  strMsg="讀取圖像時出錯!可能是不支持該類型的圖像文件!";</p><p>  MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);</p><p>  return FALSE;</p><

124、p><b>  }</b></p><p>  SetPathName(lpszPathName);</p><p>  SetModifiedFlag(FALSE);</p><p>  在函數(shù)BOOL CMy111Doc::OnSaveDocument(LPCTSTR lpszPathName)里// TODO: Add your s

125、pecialized code here and/or call the base class后面添加如下代碼:</p><p>  CFile file;</p><p>  CFileException fe;</p><p>  if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|

126、CFile::shareExclusive,&fe))</p><p><b>  {</b></p><p>  ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);</p><p>  return FALSE;</p>

127、<p><b>  }</b></p><p>  BOOL bSuccess=FALSE;</p><p><b>  TRY</b></p><p><b>  {</b></p><p>  BeginWaitCursor();</p><

128、p>  bSuccess=::SaveDIB(m_hDIB,file);</p><p>  file.Close();</p><p><b>  }</b></p><p>  CATCH(CException,eSave)</p><p><b>  {</b></p>&

129、lt;p>  file.Abort();</p><p>  EndWaitCursor();</p><p>  ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);</p><p>  return FALSE;</p><p>&l

130、t;b>  }</b></p><p><b>  END_CATCH</b></p><p>  EndWaitCursor();</p><p>  SetModifiedFlag(FALSE);</p><p>  if(!bSuccess)</p><p><b&g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論