




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
中原工學院軟件學院三級實踐課題設計任務書姓名龐金鵬軟件工程(網絡軟件開發方向)101班題目PictureShow設計任務開發一個基于C++語言的圖形圖像處理系統,主要功能包括:1.圖像銳化:主要實現通過逆運算使圖像的邊緣、輪廓線以及圖像的細節變得清晰。2.圖像反色:對于彩色圖像的R\G\B各彩色實現分量取反的技術。3.圖像平移:實現圖像插入后在操作界面中的任意移動。4.圖像縮放:主要實現對圖像的比例縮放和非比例縮放,縮放方式可以按百分比和實際的圖像像素縮放。5.圖像浮雕:實現所插入圖像的浮雕效果處理。6圖像灰度化:實現圖像的灰度化處理。7圖像霧化:實現圖像的霧化處理。8圖像旋轉:實現凸顯任意角以及預定角的旋轉。開發工具:VisualC++6.0、Photoshop時間進度項目進度日期123456712345671234567設計編碼測試備注:張敏龐金鵬張羅娜原主始要資參料考與文獻[01]《VisualC++項目開發案例全程實錄》清華大學出版社[02]《VisualC++開發典型模塊大全》人民郵電出版社[03]《VisualC++基礎與案例開發詳解》清華大學出版社指導教師簽字:年月日課題題目:PictureShow摘要隨著圖形圖像技術的蓬勃發展,在現實生活中,人們對于圖像的要求也越來越高,圖像處理軟件的普及即應用也在所難免。圖形圖像處理技術的應用也無所不在,例如,日常生活中設計一個牌匾、設計一個裝修效果圖、設計一個磨具等。所以一款簡單的實用的圖形處理軟件是人們迫切需要的,所以我們決定結合所學知識利用C++開發語言設計制作一個圖像處理系。雖然在功能上不是很強大也有許多能夠增加和改進的功能,但是簡單實用是其優點,符合當今用戶的需求。在完成了針對圖像處理系統的前期調查,同時與多位軟件使用者進行了全面深入地探討和分析的基礎上,做了通圖像管理系統用戶需求分析,明確了所需要開發的軟件具有的功能、性能與界面,使系統分析及軟件開發人員能清楚的了解用戶的需求,并在此基礎上進一步提出概要設計和完成后續設計與開發工作。隨著計算機的普及生活水平的提高,計算機的普及,信息化的時代已經來臨。我們摒棄生活中許多復雜繁冗不便操作的傳統方式,而更熟練地運用計算機探索更方便快捷的效率的方式。面向對象是對現實世界模型的自然延伸,面向對象的方法可以直接面對客觀存在的事物進行軟件開發?,F代人的時間觀越來越強,生活也越來越忙,人們在處理日常工作時對方便快捷的處理工具軟件的依賴性越來越強,其中不乏包括對圖像的處理,因此我們本次課題選擇了圖像處理系統這個題目。在本次的課程設計中選擇用VisualC++設計了這個工具。本次設計參考了應用我們日常中應用較為廣泛的《美圖秀秀》在設計中我們加入了圖像反色、平移、銳化、以及灰度化處理等功能。關鍵詞:圖像處理系統、VisualC++目錄TOC\o"1-3"\h\z第1章項目分析 11.1問題描述 11.2技術分析 1第2章系統分析與設計 32.1系統分析 32.2系統設計 32.2.1結構分析 32.2.2流程分析 4第3章實現 73.1主界面 73.1.1主界面 73.1.2主要代碼 83.1.3插入的原圖 93.2圖像銳化處理的實現 93.2.1圖像銳化處理后的界面 103.2.2主要代碼 103.3圖像反色處理的實現 133.3.1圖像反色處理后的界面 133.3.2主要代碼 133.4圖像平移的實現 163.4.1圖像平移后的界面 163.4.2主要代碼 163.5圖像縮放處理的實現 223.5.1圖像縮放處理后的界面 223.5.2主要代碼 233.6圖像浮雕處理的實現 303.6.1圖像浮雕處理后的圖像 313.6.2源代碼 313.7圖像灰度化處理的實現 323.7.1圖像灰度化處理后的圖像 333.7.2源代碼 333.8圖像霧化處理的實現 343.8.1圖像霧化處理后的圖像 343.8.2源代碼 343.9圖像旋轉處理的實現 363.9.1圖像旋轉處理后的圖像 363.9.2源代碼 37第4章結束語 42附錄:主要源程序 44PAGE31第1章項目分析隨著信息化的發展,在現實生活中,人們對于圖像的要求以及圖像的效果越來越高,圖像處理軟件的普及應用也在所難免。圖形圖像處理技術的應用也無所不在。例如,日常生活中設計一個牌匾、設計一個裝修效果圖、設計一個磨具等。所以一款簡單的實用的圖形處理軟件是人們迫切需要的,所以我們決定結合所學知識利用C++開發語言設計制作一個簡單圖像處理系統。根據日常所用的圖像處理軟件,我們預定加入圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等功能。1.1問題描述本系統屬于小型圖像處理軟件的開發,主要實現的是圖像的顯示和圖像文件的銳化、反色、縮放、浮雕、灰度化等的各種操作。(1)、怎樣對主界面進行設計,以及采用怎樣的操作,怎樣使用戶操作起來更加方便。(2)、怎樣導入圖片、以及如何保存處理后的圖片。(3)、在各操作中,怎樣求出各個像素的R、G、B顏色組成以及通過怎樣的方法對各個點進行處理,最后得出處理后的效果圖。(4)、對API、Vfw等函數的運用。(5)、利用數學公式,實現對圖像的轉換以及其中各部分的算法。(6)、有時同一種圖像轉化技術可通過多種方法進行實現,需要通過比較選擇最為簡便最為適合的運算方法。1.2技術分析設計一個基本的圖像處理系統,具有圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等功能。要求整個系統有美觀的操作界面,用戶操作方便快捷。(1)、圖像銳化:通過API函數獲取位圖資源的二進制圖像數據。圖像的二進制數據是由圖像每個像素的R、G、B顏色值組成,通過循環語句修改每個像素的顏色值,進而達到銳化的效果。(2)、圖像反色:反色效果就是將圖像的各像素的RGB分量分別和255相減以后形成的效果。使用了Vfw庫中的函數圖像來顯示圖像。(3)、圖像平移:可以先求出原圖各點的RGB值,平移后所得圖的各點的RGB值是由原圖各點的平移后所得。即將原圖各點的坐標帶入公式計算后顯示到新的位置即可。(4)、圖像縮放:圖像縮放主要有兩種,按比例縮放和任意縮放。可采用最鄰近差值法,主要思想實際就是四舍五入。將一個實數的坐標像素等于該點最近的圖像像素值。(5)、圖像浮雕:浮雕效果就是對圖片上的每一點的像素上進行處理。首先循環遍歷每一點的像素,取像素的R、G、B元素值,把這些元素值減去相鄰像素的元素值后再加上128元素值的取值在0—255,則超過255的元素復制為255,小于0的賦值為0,然后將3個元素的值重新組合起來賦予原來的像素即可。(6)、圖像灰度化處理:在圖像的灰度化過程中,首先需要獲取像素點的紅、綠、藍分量值,然后將其乘以相應的分量,最后重新設置像素的顏色即可。(7)、圖像霧化:霧化效果的實現主要通過隨機交換圖像上臨近的像素來實現。在一個雙層循環中先調用rand函數產生一個隨機數,之后根據該隨機數計算出指定的像素的位置。如果是移動垂直方向的像素,將要使用隨機數乘以寬度,得到位置后,就可以借助一個臨時變量實現像素數據的交換。(8)、圖像旋轉:利用數學公式來實現,可以實現任意角度的旋轉。在數學中,利用矩陣變換可以輕而易舉的實現轉化。但是在計算機的圖形學中,需要進行坐標原點的轉換。在進行某一點的轉換前,需要將計算機的圖像左邊轉化為數學坐標,公式x=x0-0.5W,y=-y0+0.5h(W表示原圖原像的寬度,h表示原圖像的高度),之后將數學坐標轉化為圖像坐標,公式為x=x0+0.5Wnew,y=-y0+0.5Hnew(Wnew和Hnew表示新圖像的寬度和高度),通過線性代數或三角函數可知一個點的坐標可表示為,X=XcosA+YsinA,Y=-XsinA+YcosA(A為旋轉角)。然后通過矩陣變換抽象出兩個與X、Y無關的變量,方法:Dx=-0.5WnewcosA-0.5HnewsinA+0.5W;Dy=0.5WnewsinA-0.5HnewcosA+0.5H通過這兩個變量可以在進行旋轉之后,計算出正確的坐標方法:X0=XcosA+YsinA+Dx;Yo=-XsinA+YcosA+Dy。第2章系統分析與設計2.1系統分析我們小組選擇的課題是圖像處理系統,我們打算參考美圖秀秀編寫一個能夠對所加入圖像進行銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等效果處理的簡單圖像處理系統。在操作方式上開始在預定采用的是像美圖秀秀一樣,打開一個圖后可以在這張圖上進行多次操作處理,可是在剛開始的編寫中我們就碰了壁,想法很好可是不知道如何下手。然后我們三個在圖書館查閱了各種書籍,發現由于我們現在所學知識的局限性,要實現這種操作方式比較困難。后來經過討論我們決定采用一種比較原始的操作方式,即先選定功能后插入圖片,然后通過改變數據等方式對圖片進行處理然后保存。即一幅圖實現一個效果,保存一次。雖然這種方法較為原始,但我們也盡量的將其做的便捷、易懂易操作。也讓我們知道了在今后的學習中遇到我們這次沒有解決的問題時應著重去學習去攻克它。相信通過今后的學習,總有一天我們會將我們的圖像處理系統逐步做的完美。打開我們所制作的《Pictureshow》圖像處理系統,我們在任務欄處設置各個功能的快捷圖標,實現了各個功能的快捷操作。主界面是一張我們通過Photoshop制作的界面圖片,增加了圖像處理系統的美觀性。我們在圖像處理系統中加入兩人圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等功能。其中在縮放、旋轉等功能中我們希望所處理的圖片不僅可以任意大小縮放、任意角度旋轉,而且能進行規定大小、規定度數的縮放以及旋轉。因此在些部分,我們可謂是費了不少心思。最后是圖像的保存,經過《Pictureshow》每一個功能進行處理的圖片都可以任意的保存在電腦中。真正的顯示了此圖像處理系統的實用性。2.2系統設計根據對圖案想處理系統的調查與需求分析我們進行了一下的結構設計以及流程分析。2.2.1結構分析我們設計的《Pictureshow》圖像處理系統擁有圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等處理效果。以下為此系統的功能結構圖:2—2—12.2.2流程分析以下為此系統的主界面流程圖,進入界面后選擇所需功能,然后從電腦中插入相應的圖片,進行圖像處理后,進行圖像保存。2—2—2在Pictureshow圖像處理系統中,銳化、反色、浮雕效果、灰度化處理這幾個模塊中,圖像處理流程基本相似,再此以銳化模塊為例進行流程分析,流程圖如下:2-2-3圖像縮放、霧化、旋轉流程基本相似,再此以縮放為例進行流程分析:2-2-4圖像平移所用的思想與其他模塊不同,所以單獨對其進行流程分析,流程圖如下:2-2-5第3章實現在我們的前期工作需求分析,設計,查閱資料做好以后,終于可以開始編程來實現我們的程序。整個程序整體上采用一個單文檔和多個基本對話框構成,主界面采用單文檔程序,在此程序中來調用各個功能模塊。而各項功能模塊采用基本對話框,各個功能之間相互獨立、互不影響。我們設計制作的圖像處理系統可以實現圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉等效果。這種設計在實現了主界面之后,各個功能模塊也就能單個實現,可以做到小組分工明確,在各個功能模塊完成后再將其整合到一起從而實現了整個圖像處理系統的運行與實現。在單個模塊的設計實現中我們采用了多種方法例如圖像縮放,我們設定了兩種縮放方式,任意放縮和按比例放縮,更加方便了使用者的方便快捷操作。3.1主界面由一個單文檔程序程序實現,在菜單選擇欄中顯示各個功能,其中一部分功能在工具欄中實現快捷操作。其中主界面的圖片是由photoshop制作完成。3.1.1主界面3-1-1主界面3.1.2主要代碼在框架窗口創建時穿件菜單、工具欄。代碼如下:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|| !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } if(!m_wndStatusBar.Create(this)|| !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failedtocreatestatusbar\n"); return-1;//failtocreate } //TODO:Deletethesethreelinesifyoudon'twantthetoolbarto //bedockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return0;}在視圖類的OnDraw方法中繪制背景圖像。代碼如下:voidCPictureShowView::OnDraw(CDC*pDC){ CPictureShowDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); ::SetWindowText(GetParent()->m_hWnd,"PictureShow"); CBitmapbmp; bmp.LoadBitmap(IDB_BITMAP1); CDCmemDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&bmp); BITMAPbmInfo; bmp.GetBitmap(&bmInfo); intwidth=bmInfo.bmWidth; intheight=bmInfo.bmHeight; CRectrc; GetClientRect(rc); pDC->StretchBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,width,height,SRCCOPY); memDC.DeleteDC(); bmp.DeleteObject(); //TODO:adddrawcodefornativedatahere}3.1.3插入的原圖3-1-23.2圖像銳化處理的實現通過API函數獲取位圖資源的二進制圖像數據。圖像的二進制數據時是由圖像每個像素的R、G、B顏色值組成,通過循環語句修改每個像素的顏色值,進而達到銳化的效果。效果截圖以及實現代碼如下:3.2.13-2-13.2.2主要voidCSharpDialog::OnBtSharp(){ if(m_bLoaded) { intnWidth=m_bmInfoHeader.biWidth; intnHeight=m_bmInfoHeader.biHeight; intnLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8; for(inti=0;i<nHeight;i++) { //真彩色位圖每個像素需要3個字節表示其顏色 for(intj=0;j<nWidth*3;j+=3) { intnRed1,nGreen1,nBlue1,nRed2,nGreen2,nBlue2; BYTE*pTmpData=m_pBmpData+nLineBytes*i+j; BYTE*pNextData=m_pBmpData+nLineBytes*(i+1)+j+3; nRed1=pTmpData[2]; nGreen1=pTmpData[1]; nBlue1=pTmpData[0]; COLORREFcolor=RGB(nRed1,nGreen1,nBlue1); nRed1=(color&0xFF); nGreen1=(int)(color&62580)/256; nBlue1=(int)(color&0xFF0000)/65536; //獲取下一個像素顏色 nRed2=pNextData[2]; nGreen2=pNextData[1]; nBlue2=pNextData[0]; COLORREFclNext=RGB(nRed2,nGreen2,nBlue2); nRed2=(clNext&0xFF); nGreen2=(int)(clNext&62580)/256; nBlue2=(int)(clNext&0xFF0000)/65536; nRed1+=(nRed1-nRed2)/2; nGreen1+=(nGreen1-nGreen2)/2; nBlue1+=(nBlue1-nBlue2)/2; if(nRed1>255) nRed1=255; if(nRed1<0) nRed1=0; if(nBlue1>255) nBlue1=255; if(nBlue1<0) nBlue1=0; if(nGreen1>255) nGreen1=255; if(nGreen1<0) nGreen1=0; pTmpData[0]=nBlue1; pTmpData[1]=nGreen1; pTmpData[2]=nRed1; } } CDC*pDC=m_Image.GetDC(); BITMAPINFObmInfo; bmInfo.bmiHeader=m_bmInfoHeader; HBITMAPhbmp=CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,m_pBmpData,&bmInfo,DIB_RGB_COLORS); HBITMAPhOldBmp=m_Image.GetBitmap(); if(hbmp) m_Image.SetBitmap(hbmp); DeleteObject(hOldBmp); } }voidCSharpDialog::OnCancel(){ if(m_pBmpData!=NULL) delete[]m_pBmpData; CDialog::OnCancel();}voidCSharpDialog::OnBtSave(){ //已經加載圖像 if(m_bLoaded) { CFileDialogflDlg(FALSE,"bmp","Demo.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||"); if(flDlg.DoModal()==IDOK) { try { CStringcsSaveName=flDlg.GetPathName(); CFilefile; file.Open(csSaveName,CFile::modeCreate|CFile::modeReadWrite); //寫入位圖文件信息頭 file.Write(&m_bmFileHeader,sizeof(m_bmFileHeader)); //寫入位圖信息頭 file.Write(&m_bmInfoHeader,sizeof(m_bmInfoHeader)); //寫入位圖實際數據 file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關閉文件 file.Close(); } catch(...) { MessageBox("文件保存失敗!","提示"); } } }}3.3圖像反色處理的實現反色效果就是將就是將圖像的各像素的RGB分量分別和255相減以后形成的效果。截圖效果和實現代碼如下:3.3.13-3-13.3.2voidCReverseDlg::OnBtReverse(){ if(m_bLoaded) { intnWidth=m_bmInfoHeader.biWidth; intnHeight=m_bmInfoHeader.biHeight; intnLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8; for(inti=0;i<nHeight;i++) { //真彩色位圖每個像素需要3個字節表示其顏色 for(intj=0;j<nWidth*3;j+=3) { intnRed,nGreen,nBlue; BYTE*pTmpData=m_pBmpData+nLineBytes*i+j; nRed=pTmpData[2]; nGreen=pTmpData[1]; nBlue=pTmpData[0]; nRed=abs(255-nRed); nGreen=abs(255-nGreen); nBlue=abs(255-nBlue); pTmpData[0]=nBlue; pTmpData[1]=nGreen; pTmpData[2]=nRed; } } CDC*pDC=m_Image.GetDC(); BITMAPINFObmInfo; bmInfo.bmiHeader=m_bmInfoHeader; HBITMAPhbmp=CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,m_pBmpData,&bmInfo,DIB_RGB_COLORS); HBITMAPhOldBmp=m_Image.GetBitmap(); if(hbmp) m_Image.SetBitmap(hbmp); DeleteObject(hOldBmp); } }voidCReverseDlg::OnBtSave(){ //已經加載圖像 if(m_bLoaded) { CFileDialogflDlg(FALSE,"bmp","Demo.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||"); if(flDlg.DoModal()==IDOK) { try { CStringcsSaveName=flDlg.GetPathName(); CFilefile; file.Open(csSaveName,CFile::modeCreate|CFile::modeReadWrite); //寫入位圖文件信息頭 file.Write(&m_bmFileHeader,sizeof(m_bmFileHeader)); //寫入位圖信息頭 file.Write(&m_bmInfoHeader,sizeof(m_bmInfoHeader)); //寫入位圖實際數據 file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關閉文件 file.Close(); } catch(...) { MessageBox("文件保存失敗!","提示"); } } } }voidCReverseDlg::OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){ //TODO:Addyourmessagehandlercodehereand/orcalldefault m_ImagePanel.OnHScroll(nSBCode,nPos,pScrollBar); CDialog::OnHScroll(nSBCode,nPos,pScrollBar);}BOOLCReverseDlg::OnMouseWheel(UINTnFlags,shortzDelta,CPointpt){ //TODO:Addyourmessagehandlercodehereand/orcalldefault m_ImagePanel.OnMouseWheel(nFlags,zDelta,pt); returnCDialog::OnMouseWheel(nFlags,zDelta,pt);}voidCReverseDlg::OnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){ //TODO:Addyourmessagehandlercodehereand/orcalldefault m_ImagePanel.OnVScroll(nSBCode,nPos,pScrollBar); CDialog::OnVScroll(nSBCode,nPos,pScrollBar);}BOOLCReverseDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_ImagePanel.Create(IDD_IMAGEPANEL_DIALOG,this); CRectrcClient,rcFrame; m_ImagePanel.GetClientRect(rcClient); m_Panel.GetClientRect(rcFrame); m_Panel.MapWindowPoints(this,rcFrame); m_ImagePanel.MoveWindow(rcFrame); m_ImagePanel.ShowWindow(SW_SHOW); m_Image.SetParent(&m_ImagePanel); CRectrcBmp; m_Image.GetClientRect(rcBmp); m_Image.MoveWindow(0,0,rcBmp.Width(),rcBmp.Height()); returnTRUE;}voidCReverseDlg::OnCancel(){ if(m_pBmpData!=NULL) delete[]m_pBmpData; CDialog::OnCancel();}3.4圖像平移的實現先求出原圖個點的RGP值,平移后所得圖的各點的RGP值是由原圖各點的平移后所得。截圖效果和實現代碼如下:3.4.13-4-13.4.2主要voidCMoveBmp::OnBtLoad(){ CFileDialogflDlg(TRUE,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||",this); if(flDlg.DoModal()==IDOK) { CStringcsFileName=flDlg.GetPathName(); m_BmpName.SetWindowText(csFileName); if(m_hBmp!=NULL) { DeleteObject(m_hBmp); m_hBmp=NULL; } m_hBmp=(HBITMAP)LoadImage(NULL,csFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(m_hBmp) { m_Image.SetBitmap(m_hBmp); m_bLoaded=TRUE; } CFilefile; file.Open(csFileName,CFile::modeRead); file.Read(&m_bmFileHeader,sizeof(BITMAPFILEHEADER)); file.Read(&m_bmInfoHeader,sizeof(BITMAPINFOHEADER)); intszPalette=0; if(m_bmInfoHeader.biBitCount!=24) { file.Close(); MessageBox("請選擇真彩色位圖!","提示"); return; } if(m_bmInfoHeader.biSizeImage==0) { intexternWidth; //計算源位圖每行使用的字節數 externWidth=m_bmInfoHeader.biWidth*3; if(externWidth%4!=0) externWidth=4-externWidth%4; else externWidth=0; m_bmInfoHeader.biSizeImage=m_bmInfoHeader.biHeight*(m_bmInfoHeader.biWidth*3+externWidth); } intnBmpData=m_bmInfoHeader.biSizeImage; m_dwBmpSize=m_bmInfoHeader.biSizeImage; if(m_pBmpData!=NULL) { delete[]m_pBmpData; m_pBmpData=NULL; } if(m_pOrgData!=NULL) { delete[]m_pOrgData; m_pOrgData=NULL; } m_pBmpData=newBYTE[nBmpData]; m_pOrgData=newBYTE[nBmpData]; file.ReadHuge(m_pBmpData,nBmpData); file.Close(); memcpy(m_pOrgData,m_pBmpData,nBmpData); //設置滾動范圍 CRectbmpRC,wndRC; m_ImagePanel.GetClientRect(wndRC); m_Image.GetClientRect(bmpRC); m_ImagePanel.OnHScroll(SB_LEFT,1,NULL); m_ImagePanel.OnVScroll(SB_LEFT,1,NULL); m_ImagePanel.SetScrollRange(SB_VERT,0,bmpRC.Height()-wndRC.Height()); m_ImagePanel.SetScrollRange(SB_HORZ,0,bmpRC.Width()-wndRC.Width()); } }voidCMoveBmp::OnBtSave(){ //已經加載圖像 if(m_bLoaded) { CFileDialogflDlg(FALSE,"bmp","Demo.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||"); if(flDlg.DoModal()==IDOK) { try { CStringcsSaveName=flDlg.GetPathName(); CFilefile; file.Open(csSaveName,CFile::modeCreate|CFile::modeReadWrite); //寫入位圖文件信息頭 file.Write(&m_bmFileHeader,sizeof(m_bmFileHeader)); //寫入位圖信息頭 file.Write(&m_bmInfoHeader,sizeof(m_bmInfoHeader)); //寫入位圖實際數據 file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關閉文件 file.Close(); } catch(...) { MessageBox("文件保存失敗!","提示"); } } } }voidCMoveBmp::MoveBmp(intnX,intnY){ if(m_bLoaded) { intnWidth=m_bmInfoHeader.biWidth; intnHeight=m_bmInfoHeader.biHeight; intnLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8; intx=nX; inty=nY; if(abs(nY)>=nHeight||abs(nX)>=nWidth) { return; } if(nY<0) //先上移動 { nY=abs(nY); for(inti=nHeight-nY;i>=0;i--) { BYTE*pCurData=m_pBmpData+nLineBytes*i; //獲取行數據 //將當前行數據賦值給上一行數據 BYTE*pPreData=m_pBmpData+nLineBytes*(i+nY-1); memcpy(pPreData,pCurData,nLineBytes); } //填充白色背景 BYTE*pData=newBYTE[nLineBytes*(nY-1)]; for(intj=0;j<nLineBytes*(nY-1);j++) { pData[j]=255; } BYTE*pTmpData=m_pBmpData; memcpy(pTmpData,pData,nLineBytes*(nY-1)); delete[]pData; } elseif(nY>0) //向下移動 { for(inti=nY;i<nHeight;i++) { BYTE*pCurData=m_pBmpData+nLineBytes*i; //獲取行數據 //將當前行數據賦值給上一行數據 BYTE*pPreData=m_pBmpData+nLineBytes*(i-nY); memcpy(pPreData,pCurData,nLineBytes); } //填充白色背景 BYTE*pData=newBYTE[nLineBytes*nY]; for(intj=0;j<nLineBytes*nY;j++) { pData[j]=255; } BYTE*pBKData=m_pBmpData+nLineBytes*(nHeight-nY); memcpy(pBKData,pData,nLineBytes*nY); delete[]pData; } if(nX<0) //向左移動 { nX=abs(nX); for(inti=0;i<nLineBytes;i++) { BYTE*pCurData=m_pBmpData+i+nX*3; //獲取列數據 BYTE*pPreData=m_pBmpData+(i); for(intj=0;j<nHeight;j++) { *(pPreData+j*nLineBytes)=*(pCurData+j*nLineBytes); } } //填充右邊的背景顏色 for(i=nLineBytes-nX*3-1;i<nLineBytes;i++) //遍歷列 { BYTE*pBKData=m_pBmpData+i; for(intj=0;j<nHeight;j++) //遍歷行 { *(pBKData+j*nLineBytes)=255; } } } elseif(nX>0) //向右移動 { for(inti=nLineBytes-(nX*3);i>=0;i--) { BYTE*pCurData=m_pBmpData+i-1; //獲取列數據 BYTE*pPreData=m_pBmpData+i+nX*3-1; for(intj=0;j<nHeight;j++) { *(pPreData+j*nLineBytes)=*(pCurData+j*nLineBytes); } } //填充右邊的背景顏色 for(i=0;i<nX*3;i++) //遍歷列 { BYTE*pBKData=m_pBmpData+i; for(intj=0;j<nHeight;j++) //遍歷行 { *(pBKData+j*nLineBytes)=255; } } } m_OrgPt.x+=x; m_OrgPt.y+=y; CDC*pDC=m_Image.GetDC(); BITMAPINFObmInfo; bmInfo.bmiHeader=m_bmInfoHeader; HBITMAPhbmp=CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,m_pBmpData,&bmInfo,DIB_RGB_COLORS); HBITMAPhOldBmp=m_Image.GetBitmap(); if(hbmp) m_Image.SetBitmap(hbmp); DeleteObject(hOldBmp); }}voidCMoveBmp::OnMouseDrag(WPARAMwParam,LPARAMlParam){ intnX=m_Image.m_ptOrg.x; intnY=m_Image.m_ptOrg.y; intnDesX=LOWORD(lParam); intnDesY=HIWORD(lParam); MoveBmp(nDesX-nX,nDesY-nY);}3.5圖像縮放處理的實現圖像縮放主要有兩種,按比例縮放和任意縮放。采用最鄰近插值法主要思想實際就是四舍五入,將一個實數的坐標像素等于與該點最近的圖像像素值。截圖效果和實現代碼如下:3.5.13-5-13-5-23.5.2主要代碼voidCStretchImage::OnBtAtomize(){ if(m_bLoaded) { CButton*pButton=(CButton*)this->GetDlgItem(IDC_PERCENT); intnSelState=pButton->GetCheck(); doubledXRate=0.0; doubledYRate=0.0; if(nSelState) //百分比 { dXRate=(m_HorParam/100.0); (dXRate>1.0)?dXRate:1-dXRate; dYRate=(m_VerParam/100.0); (dYRate>1.0)?dYRate:1-dYRate; } else //實際像素 { dXRate=(double)m_HorParam/m_bmInfoHeader.biWidth; dYRate=(double)m_VerParam/m_bmInfoHeader.biHeight; } m_nZoomWidth=(int)(m_bmInfoHeader.biWidth*dXRate+0.5); m_nZoomHeight=(int)(m_bmInfoHeader.biHeight*dYRate+0.5); if(m_pZoomData!=NULL) { delete[]m_pZoomData; m_pZoomData=NULL; } ZoomImage(m_pBmpData,m_pZoomData,m_bmInfoHeader.biWidth,m_bmInfoHeader.biHeight,m_nZoomWidth, m_nZoomHeight,dXRate,dYRate); BYTEbyByteAlign; //位圖行字節對齊 BYTE*pListData=m_pZoomData+((DWORD)m_nZoomHeight-1)*m_nZoomWidth*4; if(m_nZoomWidth%4!=0) byByteAlign=4-((m_nZoomWidth*3L)%4); else byByteAlign=0; m_nBmpSize=(m_nZoomWidth*3+byByteAlign)*m_nZoomHeight; BYTE*pBmpData=newBYTE[m_nBmpSize]; memset(pBmpData,0,m_nBmpSize); BYTEbyZeroData=0; BYTE*pSrcData=pBmpData; for(inty=0;y<m_nZoomHeight;y++) { for(intx=0;x<m_nZoomWidth;x++) { memcpy(pSrcData,pListData,3); pSrcData+=3; pListData+=4; } for(inti=0;i<byByteAlign;i++) { memcpy(pSrcData,&byZeroData,1); pSrcData+=1; } pListData-=2L*m_nZoomWidth*4; } CDC*pDC=m_Image.GetDC(); BITMAPINFOHEADERbHeader=m_bmInfoHeader; bHeader.biHeight=m_nZoomHeight; bHeader.biWidth=m_nZoomWidth; bHeader.biSizeImage=m_nBmpSize; BITMAPINFObInfo; bInfo.bmiHeader=bHeader; HBITMAPhBmp=m_Image.SetBitmap(CreateDIBitmap(pDC->m_hDC,&bHeader,CBM_INIT,pBmpData,&bInfo,DIB_RGB_COLORS)); if(hBmp!=NULL) { ::DeleteObject(hBmp); } delete[]pBmpData; //設置滾動范圍 CRectbmpRC,wndRC; m_ImagePanel.GetClientRect(wndRC); m_Image.GetClientRect(bmpRC); m_ImagePanel.OnHScroll(SB_LEFT,1,NULL); m_ImagePanel.OnVScroll(SB_LEFT,1,NULL); m_ImagePanel.SetScrollRange(SB_VERT,0,bmpRC.Height()-wndRC.Height()); m_ImagePanel.SetScrollRange(SB_HORZ,0,bmpRC.Width()-wndRC.Width()); m_Zoomed=TRUE; }}voidCStretchImage::OnBtLoad(){ CFileDialogflDlg(TRUE,"","",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||",this); if(flDlg.DoModal()==IDOK) { CStringcsFileName=flDlg.GetPathName(); m_BmpName.SetWindowText(csFileName); if(m_hBmp!=NULL) { DeleteObject(m_hBmp); m_hBmp=NULL; } m_hBmp=(HBITMAP)LoadImage(NULL,csFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(m_hBmp) { m_Image.SetBitmap(m_hBmp); m_bLoaded=TRUE; } CFilefile; file.Open(csFileName,CFile::modeRead); file.Read(&m_bmFileHeader,sizeof(BITMAPFILEHEADER)); file.Read(&m_bmInfoHeader,sizeof(BITMAPINFOHEADER)); m_nZoomHeight=m_bmInfoHeader.biHeight; m_nZoomWidth=m_bmInfoHeader.biWidth; CStringcsText,csCaption; csText.Format("%d",m_nZoomHeight); csCaption="高度:"+csText; m_BmpHeight.SetWindowText(csCaption); csText.Format("%d",m_nZoomWidth); csCaption="寬度:"+csText; m_BmpWidth.SetWindowText(csCaption); intszPalette=0; if(m_bmInfoHeader.biBitCount!=24) { file.Close(); MessageBox("請選擇真彩色位圖!","提示"); return; } if(m_bmInfoHeader.biSizeImage==0) { intexternWidth; //計算源位圖每行使用的字節數 externWidth=m_bmInfoHeader.biWidth*3; if(externWidth%4!=0) externWidth=4-externWidth%4; else externWidth=0; m_bmInfoHeader.biSizeImage=m_bmInfoHeader.biHeight*(m_bmInfoHeader.biWidth*3+externWidth); } intnBmpData=m_bmInfoHeader.biSizeImage; if(m_pBmpData!=NULL) { delete[]m_pBmpData; m_pBmpData=NULL; } m_pBmpData=newBYTE[nBmpData]; file.ReadHuge(m_pBmpData,nBmpData); file.Close(); intsizeofbuffer=m_bmInfoHeader.biWidth*m_bmInfoHeader.biHeight*4; intexternWidth; externWidth=m_bmInfoHeader.biWidth*3; if(externWidth%4!=0) externWidth=4-externWidth%4; else externWidth=0; intk=0; BYTE*m_pImageTempBuffer=newBYTE[sizeofbuffer]; for(intn=m_bmInfoHeader.biHeight-1;n>=0;n--) { for(UINTm=0;m<m_bmInfoHeader.biWidth*3;m+=3) { m_pImageTempBuffer[k]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m]; //blue m_pImageTempBuffer[k+1]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m+1];//green m_pImageTempBuffer[k+2]=m_pBmpData[n*(m_bmInfoHeader.biWidth*3+externWidth)+m+2];//red m_pImageTempBuffer[k+3]=255; k+=4; } } delete[]m_pBmpData; m_pBmpData=newBYTE[sizeofbuffer]; memcpy(m_pBmpData,m_pImageTempBuffer,sizeofbuffer); delete[]m_pImageTempBuffer; //設置滾動范圍 CRectbmpRC,wndRC; m_ImagePanel.GetClientRect(wndRC); m_Image.GetClientRect(bmpRC); m_ImagePanel.OnHScroll(SB_LEFT,1,NULL); m_ImagePanel.OnVScroll(SB_LEFT,1,NULL); m_ImagePanel.SetScrollRange(SB_VERT,0,bmpRC.Height()-wndRC.Height()); m_ImagePanel.SetScrollRange(SB_HORZ,0,bmpRC.Width()-wndRC.Width()); m_Zoomed=FALSE; } }voidCStretchImage::OnPhysicalPixel(){ CButton*pButton=(CButton*)this->GetDlgItem(IDC_PHYSICALPIXEL); if(pButton) { pButton->SetCheck(TRUE); intnSelState=pButton->GetCheck(); if(nSelState) { m_VerPercent.ShowWindow(SW_HIDE); m_HorPercent.ShowWindow(SW_HIDE); m_VerParam=0; m_HorParam=0; UpdateData(FALSE); m_VerDegree.SetPos(0); m_HorDegree.SetPos(0); m_VerDegree.SetRange(0,32567); m_HorDegree.SetRange(0,32567); } pButton=(CButton*)this->GetDlgItem(IDC_PERCENT); pButton->SetCheck(FALSE); }}voidCStretchImage::OnPercent(){ CButton*pButton=(CButton*)this->GetDlgItem(IDC_PERCENT); if(pButton) { pButton->SetCheck(TRUE); intnSelState=pButton->GetCheck(); if(nSelState) { m_VerPercent.ShowWindow(SW_SHOW); m_HorPercent.ShowWindow(SW_SHOW); m_VerParam=0; m_HorParam=0; UpdateData(FALSE); m_VerDegree.SetPos(0); m_HorDegree.SetPos(0); m_VerDegree.SetRange(0,200); m_HorDegree.SetRange(0,200); } pButton=(CButton*)this->GetDlgItem(IDC_PHYSICALPIXEL); pButton->SetCheck(FALSE); } }voidCStretchImage::OnBtSave(){ //已經加載圖像 if(m_bLoaded&&m_Zoomed) { CFileDialogflDlg(FALSE,"bmp","Demo.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"位圖文件|*.bmp||"); if(flDlg.DoModal()==IDOK) { try { CStringcsSaveName=flDlg.GetPathName(); CFilefile; file.Open(csSaveName,CFile::modeCreate|CFile::modeReadWrite); //寫入位圖文件信息頭 file.Write(&m_bmFileHeader,sizeof(m_bmFileHeader)); BITMAPINFOHEADERbHeader=m_bmInfoHeader; bHeader.biHeight=m_nZoomHeight; bHeader.biWidth=m_nZoomWidth; bHeader.biSizeImage=m_nBmpSize; //寫入位圖信息頭 file.Write(&bHeader,sizeof(bHeader)); //寫入位圖實際數據 BYTEbyByteAlign; UINToutHeight=m_nZoomHeight; UINToutWidth=m_nZoomWidth; BYTE*pListData=m_pZoomData+((DWORD)outHeight-1)*outWidth*4; if(outWidth%4!=0) byByteAlign=4-((outWidth*3L)%4); else byByteAlign=0; BYTEbyZeroData=0; for(inty=0;y<outHeight;y++) { for(intx=0;x<outWidth;x++) { file.Write(pListData,3); pListData+=4; } for(inti=0;i<byByteAlign;i++) { file.Write(&byZeroData,1); } pListData-=2L*outWidth*4; } file.Close(); //關閉文件 } catch(...) { MessageBox("文件保存失敗!","提示"); } } } }3.6圖像浮雕處理的實現浮雕效果就是對圖片上的每一點的像素上進行處理。首先循環遍歷每一點的像素,取像素的R、G、B元素值,把這些元素值減去相鄰像素的元素值后再加上128.元素值的取值在0—255,則超過255的元素復制為255,小于0的賦值為0,然后將3個元素的值重新組合起來賦予原來的像素。截圖效果和實現代碼如下:3.6.3-6-13.6.voidCCarveDlg::OnBtReverse(){ if(m_bLoaded) { intnWidth=m_bmInfoHeader.biWidth; intnHeight=m_bmInfoHeader.biHeight; intnLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8; for(inti=0;i<nHeight;i++) { //真彩色位圖每個像素需要3個字節表示其顏色 for(intj=0;j<nWidth*3;j+=3) { intnRed,nGreen,nBlue,nNextRed,nNextGreen,nNextBlue; BYTE*pTmpData=m_pBmpData+nLineBytes*i+j; BYTE*pNextData=m_pBmpData+nLineBytes*(i+1)+j+4; nRed=pTmpData[2]; nGreen=pTmpData[1]; nBlue=pTmpData[0]; nNextRed=pNextData[2]; nNextGreen=pNextData[1]; nNextBlue=pNextData[0]; nRed=abs(nRed-nNextRed+128); nGreen=abs(nGreen-nNextGreen+128); nBlue=abs(nBlue-nNextBlue+128) if(nRed>255) nRed=255; if(nRed<0) nRed=0; if(nBlue>255) nBlue=255; if(nBlue<0) nBlue=0; if(nGreen>255) nGreen=255; if(nGreen<0) nGreen=0; pTmpData[0]=nBlue; pTmpData[1]=nGreen; pTmpData[2]=nRed; } } CDC*pDC=m_Image.GetDC(); BITMAPINFObmInfo; bmInfo.bmiHeader=m_bmInfoHeader; HBITMAPhbmp=CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,m_pBmpData,&bmInfo,DIB_RGB_COLORS); HBITMAPhOldBmp=m_Image.GetBitmap(); if(hbmp) m_Image.SetBitmap(hbmp); DeleteObject(hOldBmp); } }3.7圖像灰度化處理的實現在圖像的灰度化過程中,首先需要獲取像素點的紅、綠、藍分量值,然后將其乘以相應的分量,最后重新設置像素的顏色。截圖效果和實現代碼如下:3.7.1圖像3-7-13.7.voidCGrayBmp::OnBtGray(){ if(m_bLoaded) { intnWidth=m_bmInfoHeader.biWidth; intnHeight=m_bmInfoHeader.biHeight; intnLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8; for(inti=0;i<nHeight;i++) { //真彩色位圖每個像素需要3個字節表示其顏色 for(intj=0;j<nWidth*3;j+=3) { intnRed,nGreen,nBlue,nGray; BYTE*pTmpData=m_pBmpData+nLineBytes*i+j; nRed=pTmpData[2]; nGreen=pTmpData[1]; nBlue=pTmpData[0]; nGray=(int)(0.38*(float)nRed+0.49*(float)nGreen+0.1*(float)nBlue); pTmpData[0]=nGray; pTmpData[1]=nGray; pTmpData[2]=nGray; } } CDC*pDC=m_Image.GetDC(); BITMAPINFObmInfo; bmInfo.bmiHeader=m_bmInfoHeader; HBITMAPhbmp=CreateDIBitmap(pDC->m_hDC,&m_bmInfoHeader,CBM_INIT,m_pBmpData,&bmInfo,DIB_RGB_COLORS); HBITMAPhOldBmp=m_Image.GetBitmap(); if
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川資陽中學2024-2025學年高三5月高考沖刺英語試題含解析
- 江蘇省泰州市實驗小學2024-2025學年數學四下期末質量跟蹤監視模擬試題含解析
- 四川省樂山市峨眉山市第二中學2025年高三4月聯考物理試題含解析
- 營口市大石橋市2024-2025學年數學五年級第二學期期末達標測試試題含答案
- 專業技術人員聘用合同
- 2025版企業間服務與咨詢合同范本
- 服務供應商合同范本
- 餐飲業食材供應合同模板
- 兒童歌曲鋼琴簡易伴奏編配 課件 第1-3章 和弦-五線譜、簡譜互譯
- 1生活在新型民主國家 公開課一等獎創新教學設計(表格式)
- 無線網絡優化技術探討試題及答案
- 筆算加法(課件)-一年級下冊數學人教版
- 魯濱遜漂流記人物性格塑造與成長歷程:八年級語文教案
- 2025年鄭州信息科技職業學院單招職業適應性測試題庫附答案
- 2025年安陽職業技術學院高職單招職業技能測試近5年??及鎱⒖碱}庫含答案解析
- 成人原發性腹壁疝腹腔鏡手術中國專家共識(2025版)解讀
- 江蘇省徐州市2024-2025學年五年級第二學期期中數學試題一(含答案)
- 2024年中國食品級雙氧水行業調查報告
- 計算機網絡試題題庫單選題100道及答案
- 線上線下聯動的營銷推廣活動方案
- AIGC技術在非遺數字化中的應用研究
評論
0/150
提交評論