版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于vc課程設(shè)計--基于vc++平臺簡單數(shù)字圖像處理界面設(shè)計
- 數(shù)字圖像處理-圖像縮放的vc++實現(xiàn)
- 圖像處理課程設(shè)計--基于matlab的數(shù)字圖像處理
- 數(shù)字圖像處理課程設(shè)計--實現(xiàn)簡單的數(shù)字圖像處理功能
- [vc++畢設(shè)]vc++可視化圖像處理系統(tǒng)+論文
- 基于VC++的遙感圖像處理系統(tǒng)初步設(shè)計.pdf
- vc++課程設(shè)計報告
- 基于VC++的醫(yī)學(xué)圖像處理系統(tǒng)研究.pdf
- 基于VC++的DPIV圖像后處理軟件系統(tǒng).pdf
- 圖像處理課程設(shè)計
- matlab圖像處理課程設(shè)計報告
- 基于vc數(shù)字圖像處理課程設(shè)計說明書
- 圖像處理課程設(shè)計
- 數(shù)字圖像處理課程設(shè)計--基于matlab的數(shù)字圖像處理
- vc++課程設(shè)計---簡單計算器的設(shè)計
- vc++軟件課程設(shè)計報告
- vc++課程設(shè)計報告--簡單科學(xué)計算器設(shè)計
- 基于matlab的圖像處理的課程設(shè)計
- 數(shù)字圖像處理課程設(shè)計--基于matlab的數(shù)字圖像處理
- matlab課程設(shè)計--圖像處理
評論
0/150
提交評論