版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
中原工學(xué)院軟件學(xué)院三級(jí)實(shí)踐課題設(shè)計(jì)任務(wù)書姓名龐金鵬軟件工程(網(wǎng)絡(luò)軟件開發(fā)方向)101班題目PictureShow設(shè)計(jì)任務(wù)開發(fā)一個(gè)基于C++語言的圖形圖像處理系統(tǒng),主要功能包括:1.圖像銳化:主要實(shí)現(xiàn)通過逆運(yùn)算使圖像的邊緣、輪廓線以及圖像的細(xì)節(jié)變得清晰。2.圖像反色:對(duì)于彩色圖像的R\G\B各彩色實(shí)現(xiàn)分量取反的技術(shù)。3.圖像平移:實(shí)現(xiàn)圖像插入后在操作界面中的任意移動(dòng)。4.圖像縮放:主要實(shí)現(xiàn)對(duì)圖像的比例縮放和非比例縮放,縮放方式可以按百分比和實(shí)際的圖像像素縮放。5.圖像浮雕:實(shí)現(xiàn)所插入圖像的浮雕效果處理。6圖像灰度化:實(shí)現(xiàn)圖像的灰度化處理。7圖像霧化:實(shí)現(xiàn)圖像的霧化處理。8圖像旋轉(zhuǎn):實(shí)現(xiàn)凸顯任意角以及預(yù)定角的旋轉(zhuǎn)。開發(fā)工具:VisualC++6.0、Photoshop時(shí)間進(jìn)度項(xiàng)目進(jìn)度日期123456712345671234567設(shè)計(jì)編碼測(cè)試備注:張敏龐金鵬張羅娜原主始要資參料考與文獻(xiàn)[01]《VisualC++項(xiàng)目開發(fā)案例全程實(shí)錄》清華大學(xué)出版社[02]《VisualC++開發(fā)典型模塊大全》人民郵電出版社[03]《VisualC++基礎(chǔ)與案例開發(fā)詳解》清華大學(xué)出版社指導(dǎo)教師簽字:年月日課題題目:PictureShow摘要隨著圖形圖像技術(shù)的蓬勃發(fā)展,在現(xiàn)實(shí)生活中,人們對(duì)于圖像的要求也越來越高,圖像處理軟件的普及即應(yīng)用也在所難免。圖形圖像處理技術(shù)的應(yīng)用也無所不在,例如,日常生活中設(shè)計(jì)一個(gè)牌匾、設(shè)計(jì)一個(gè)裝修效果圖、設(shè)計(jì)一個(gè)磨具等。所以一款簡(jiǎn)單的實(shí)用的圖形處理軟件是人們迫切需要的,所以我們決定結(jié)合所學(xué)知識(shí)利用C++開發(fā)語言設(shè)計(jì)制作一個(gè)圖像處理系。雖然在功能上不是很強(qiáng)大也有許多能夠增加和改進(jìn)的功能,但是簡(jiǎn)單實(shí)用是其優(yōu)點(diǎn),符合當(dāng)今用戶的需求。在完成了針對(duì)圖像處理系統(tǒng)的前期調(diào)查,同時(shí)與多位軟件使用者進(jìn)行了全面深入地探討和分析的基礎(chǔ)上,做了通圖像管理系統(tǒng)用戶需求分析,明確了所需要開發(fā)的軟件具有的功能、性能與界面,使系統(tǒng)分析及軟件開發(fā)人員能清楚的了解用戶的需求,并在此基礎(chǔ)上進(jìn)一步提出概要設(shè)計(jì)和完成后續(xù)設(shè)計(jì)與開發(fā)工作。隨著計(jì)算機(jī)的普及生活水平的提高,計(jì)算機(jī)的普及,信息化的時(shí)代已經(jīng)來臨。我們摒棄生活中許多復(fù)雜繁冗不便操作的傳統(tǒng)方式,而更熟練地運(yùn)用計(jì)算機(jī)探索更方便快捷的效率的方式。面向?qū)ο笫菍?duì)現(xiàn)實(shí)世界模型的自然延伸,面向?qū)ο蟮姆椒梢灾苯用鎸?duì)客觀存在的事物進(jìn)行軟件開發(fā)?,F(xiàn)代人的時(shí)間觀越來越強(qiáng),生活也越來越忙,人們?cè)谔幚砣粘9ぷ鲿r(shí)對(duì)方便快捷的處理工具軟件的依賴性越來越強(qiáng),其中不乏包括對(duì)圖像的處理,因此我們本次課題選擇了圖像處理系統(tǒng)這個(gè)題目。在本次的課程設(shè)計(jì)中選擇用VisualC++設(shè)計(jì)了這個(gè)工具。本次設(shè)計(jì)參考了應(yīng)用我們?nèi)粘V袘?yīng)用較為廣泛的《美圖秀秀》在設(shè)計(jì)中我們加入了圖像反色、平移、銳化、以及灰度化處理等功能。關(guān)鍵詞:圖像處理系統(tǒng)、VisualC++目錄TOC\o"1-3"\h\z第1章項(xiàng)目分析 11.1問題描述 11.2技術(shù)分析 1第2章系統(tǒng)分析與設(shè)計(jì) 32.1系統(tǒng)分析 32.2系統(tǒng)設(shè)計(jì) 32.2.1結(jié)構(gòu)分析 32.2.2流程分析 4第3章實(shí)現(xiàn) 73.1主界面 73.1.1主界面 73.1.2主要代碼 83.1.3插入的原圖 93.2圖像銳化處理的實(shí)現(xiàn) 93.2.1圖像銳化處理后的界面 103.2.2主要代碼 103.3圖像反色處理的實(shí)現(xiàn) 133.3.1圖像反色處理后的界面 133.3.2主要代碼 133.4圖像平移的實(shí)現(xiàn) 163.4.1圖像平移后的界面 163.4.2主要代碼 163.5圖像縮放處理的實(shí)現(xiàn) 223.5.1圖像縮放處理后的界面 223.5.2主要代碼 233.6圖像浮雕處理的實(shí)現(xiàn) 303.6.1圖像浮雕處理后的圖像 313.6.2源代碼 313.7圖像灰度化處理的實(shí)現(xiàn) 323.7.1圖像灰度化處理后的圖像 333.7.2源代碼 333.8圖像霧化處理的實(shí)現(xiàn) 343.8.1圖像霧化處理后的圖像 343.8.2源代碼 343.9圖像旋轉(zhuǎn)處理的實(shí)現(xiàn) 363.9.1圖像旋轉(zhuǎn)處理后的圖像 363.9.2源代碼 37第4章結(jié)束語 42附錄:主要源程序 44PAGE31第1章項(xiàng)目分析隨著信息化的發(fā)展,在現(xiàn)實(shí)生活中,人們對(duì)于圖像的要求以及圖像的效果越來越高,圖像處理軟件的普及應(yīng)用也在所難免。圖形圖像處理技術(shù)的應(yīng)用也無所不在。例如,日常生活中設(shè)計(jì)一個(gè)牌匾、設(shè)計(jì)一個(gè)裝修效果圖、設(shè)計(jì)一個(gè)磨具等。所以一款簡(jiǎn)單的實(shí)用的圖形處理軟件是人們迫切需要的,所以我們決定結(jié)合所學(xué)知識(shí)利用C++開發(fā)語言設(shè)計(jì)制作一個(gè)簡(jiǎn)單圖像處理系統(tǒng)。根據(jù)日常所用的圖像處理軟件,我們預(yù)定加入圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等功能。1.1問題描述本系統(tǒng)屬于小型圖像處理軟件的開發(fā),主要實(shí)現(xiàn)的是圖像的顯示和圖像文件的銳化、反色、縮放、浮雕、灰度化等的各種操作。(1)、怎樣對(duì)主界面進(jìn)行設(shè)計(jì),以及采用怎樣的操作,怎樣使用戶操作起來更加方便。(2)、怎樣導(dǎo)入圖片、以及如何保存處理后的圖片。(3)、在各操作中,怎樣求出各個(gè)像素的R、G、B顏色組成以及通過怎樣的方法對(duì)各個(gè)點(diǎn)進(jìn)行處理,最后得出處理后的效果圖。(4)、對(duì)API、Vfw等函數(shù)的運(yùn)用。(5)、利用數(shù)學(xué)公式,實(shí)現(xiàn)對(duì)圖像的轉(zhuǎn)換以及其中各部分的算法。(6)、有時(shí)同一種圖像轉(zhuǎn)化技術(shù)可通過多種方法進(jìn)行實(shí)現(xiàn),需要通過比較選擇最為簡(jiǎn)便最為適合的運(yùn)算方法。1.2技術(shù)分析設(shè)計(jì)一個(gè)基本的圖像處理系統(tǒng),具有圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等功能。要求整個(gè)系統(tǒng)有美觀的操作界面,用戶操作方便快捷。(1)、圖像銳化:通過API函數(shù)獲取位圖資源的二進(jìn)制圖像數(shù)據(jù)。圖像的二進(jìn)制數(shù)據(jù)是由圖像每個(gè)像素的R、G、B顏色值組成,通過循環(huán)語句修改每個(gè)像素的顏色值,進(jìn)而達(dá)到銳化的效果。(2)、圖像反色:反色效果就是將圖像的各像素的RGB分量分別和255相減以后形成的效果。使用了Vfw庫中的函數(shù)圖像來顯示圖像。(3)、圖像平移:可以先求出原圖各點(diǎn)的RGB值,平移后所得圖的各點(diǎn)的RGB值是由原圖各點(diǎn)的平移后所得。即將原圖各點(diǎn)的坐標(biāo)帶入公式計(jì)算后顯示到新的位置即可。(4)、圖像縮放:圖像縮放主要有兩種,按比例縮放和任意縮放。可采用最鄰近差值法,主要思想實(shí)際就是四舍五入。將一個(gè)實(shí)數(shù)的坐標(biāo)像素等于該點(diǎn)最近的圖像像素值。(5)、圖像浮雕:浮雕效果就是對(duì)圖片上的每一點(diǎn)的像素上進(jìn)行處理。首先循環(huán)遍歷每一點(diǎn)的像素,取像素的R、G、B元素值,把這些元素值減去相鄰像素的元素值后再加上128元素值的取值在0—255,則超過255的元素復(fù)制為255,小于0的賦值為0,然后將3個(gè)元素的值重新組合起來賦予原來的像素即可。(6)、圖像灰度化處理:在圖像的灰度化過程中,首先需要獲取像素點(diǎn)的紅、綠、藍(lán)分量值,然后將其乘以相應(yīng)的分量,最后重新設(shè)置像素的顏色即可。(7)、圖像霧化:霧化效果的實(shí)現(xiàn)主要通過隨機(jī)交換圖像上臨近的像素來實(shí)現(xiàn)。在一個(gè)雙層循環(huán)中先調(diào)用rand函數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù),之后根據(jù)該隨機(jī)數(shù)計(jì)算出指定的像素的位置。如果是移動(dòng)垂直方向的像素,將要使用隨機(jī)數(shù)乘以寬度,得到位置后,就可以借助一個(gè)臨時(shí)變量實(shí)現(xiàn)像素?cái)?shù)據(jù)的交換。(8)、圖像旋轉(zhuǎn):利用數(shù)學(xué)公式來實(shí)現(xiàn),可以實(shí)現(xiàn)任意角度的旋轉(zhuǎn)。在數(shù)學(xué)中,利用矩陣變換可以輕而易舉的實(shí)現(xiàn)轉(zhuǎn)化。但是在計(jì)算機(jī)的圖形學(xué)中,需要進(jìn)行坐標(biāo)原點(diǎn)的轉(zhuǎn)換。在進(jìn)行某一點(diǎn)的轉(zhuǎn)換前,需要將計(jì)算機(jī)的圖像左邊轉(zhuǎn)化為數(shù)學(xué)坐標(biāo),公式x=x0-0.5W,y=-y0+0.5h(W表示原圖原像的寬度,h表示原圖像的高度),之后將數(shù)學(xué)坐標(biāo)轉(zhuǎn)化為圖像坐標(biāo),公式為x=x0+0.5Wnew,y=-y0+0.5Hnew(Wnew和Hnew表示新圖像的寬度和高度),通過線性代數(shù)或三角函數(shù)可知一個(gè)點(diǎn)的坐標(biāo)可表示為,X=XcosA+YsinA,Y=-XsinA+YcosA(A為旋轉(zhuǎn)角)。然后通過矩陣變換抽象出兩個(gè)與X、Y無關(guān)的變量,方法:Dx=-0.5WnewcosA-0.5HnewsinA+0.5W;Dy=0.5WnewsinA-0.5HnewcosA+0.5H通過這兩個(gè)變量可以在進(jìn)行旋轉(zhuǎn)之后,計(jì)算出正確的坐標(biāo)方法:X0=XcosA+YsinA+Dx;Yo=-XsinA+YcosA+Dy。第2章系統(tǒng)分析與設(shè)計(jì)2.1系統(tǒng)分析我們小組選擇的課題是圖像處理系統(tǒng),我們打算參考美圖秀秀編寫一個(gè)能夠?qū)λ尤雸D像進(jìn)行銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等效果處理的簡(jiǎn)單圖像處理系統(tǒng)。在操作方式上開始在預(yù)定采用的是像美圖秀秀一樣,打開一個(gè)圖后可以在這張圖上進(jìn)行多次操作處理,可是在剛開始的編寫中我們就碰了壁,想法很好可是不知道如何下手。然后我們?nèi)齻€(gè)在圖書館查閱了各種書籍,發(fā)現(xiàn)由于我們現(xiàn)在所學(xué)知識(shí)的局限性,要實(shí)現(xiàn)這種操作方式比較困難。后來經(jīng)過討論我們決定采用一種比較原始的操作方式,即先選定功能后插入圖片,然后通過改變數(shù)據(jù)等方式對(duì)圖片進(jìn)行處理然后保存。即一幅圖實(shí)現(xiàn)一個(gè)效果,保存一次。雖然這種方法較為原始,但我們也盡量的將其做的便捷、易懂易操作。也讓我們知道了在今后的學(xué)習(xí)中遇到我們這次沒有解決的問題時(shí)應(yīng)著重去學(xué)習(xí)去攻克它。相信通過今后的學(xué)習(xí),總有一天我們會(huì)將我們的圖像處理系統(tǒng)逐步做的完美。打開我們所制作的《Pictureshow》圖像處理系統(tǒng),我們?cè)谌蝿?wù)欄處設(shè)置各個(gè)功能的快捷圖標(biāo),實(shí)現(xiàn)了各個(gè)功能的快捷操作。主界面是一張我們通過Photoshop制作的界面圖片,增加了圖像處理系統(tǒng)的美觀性。我們?cè)趫D像處理系統(tǒng)中加入兩人圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等功能。其中在縮放、旋轉(zhuǎn)等功能中我們希望所處理的圖片不僅可以任意大小縮放、任意角度旋轉(zhuǎn),而且能進(jìn)行規(guī)定大小、規(guī)定度數(shù)的縮放以及旋轉(zhuǎn)。因此在些部分,我們可謂是費(fèi)了不少心思。最后是圖像的保存,經(jīng)過《Pictureshow》每一個(gè)功能進(jìn)行處理的圖片都可以任意的保存在電腦中。真正的顯示了此圖像處理系統(tǒng)的實(shí)用性。2.2系統(tǒng)設(shè)計(jì)根據(jù)對(duì)圖案想處理系統(tǒng)的調(diào)查與需求分析我們進(jìn)行了一下的結(jié)構(gòu)設(shè)計(jì)以及流程分析。2.2.1結(jié)構(gòu)分析我們?cè)O(shè)計(jì)的《Pictureshow》圖像處理系統(tǒng)擁有圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等處理效果。以下為此系統(tǒng)的功能結(jié)構(gòu)圖:2—2—12.2.2流程分析以下為此系統(tǒng)的主界面流程圖,進(jìn)入界面后選擇所需功能,然后從電腦中插入相應(yīng)的圖片,進(jìn)行圖像處理后,進(jìn)行圖像保存。2—2—2在Pictureshow圖像處理系統(tǒng)中,銳化、反色、浮雕效果、灰度化處理這幾個(gè)模塊中,圖像處理流程基本相似,再此以銳化模塊為例進(jìn)行流程分析,流程圖如下:2-2-3圖像縮放、霧化、旋轉(zhuǎn)流程基本相似,再此以縮放為例進(jìn)行流程分析:2-2-4圖像平移所用的思想與其他模塊不同,所以單獨(dú)對(duì)其進(jìn)行流程分析,流程圖如下:2-2-5第3章實(shí)現(xiàn)在我們的前期工作需求分析,設(shè)計(jì),查閱資料做好以后,終于可以開始編程來實(shí)現(xiàn)我們的程序。整個(gè)程序整體上采用一個(gè)單文檔和多個(gè)基本對(duì)話框構(gòu)成,主界面采用單文檔程序,在此程序中來調(diào)用各個(gè)功能模塊。而各項(xiàng)功能模塊采用基本對(duì)話框,各個(gè)功能之間相互獨(dú)立、互不影響。我們?cè)O(shè)計(jì)制作的圖像處理系統(tǒng)可以實(shí)現(xiàn)圖像銳化、反色、平移、縮放、浮雕、灰度化處理、霧化、圖像旋轉(zhuǎn)等效果。這種設(shè)計(jì)在實(shí)現(xiàn)了主界面之后,各個(gè)功能模塊也就能單個(gè)實(shí)現(xiàn),可以做到小組分工明確,在各個(gè)功能模塊完成后再將其整合到一起從而實(shí)現(xiàn)了整個(gè)圖像處理系統(tǒng)的運(yùn)行與實(shí)現(xiàn)。在單個(gè)模塊的設(shè)計(jì)實(shí)現(xiàn)中我們采用了多種方法例如圖像縮放,我們?cè)O(shè)定了兩種縮放方式,任意放縮和按比例放縮,更加方便了使用者的方便快捷操作。3.1主界面由一個(gè)單文檔程序程序?qū)崿F(xiàn),在菜單選擇欄中顯示各個(gè)功能,其中一部分功能在工具欄中實(shí)現(xiàn)快捷操作。其中主界面的圖片是由photoshop制作完成。3.1.1主界面3-1-1主界面3.1.2主要代碼在框架窗口創(chuàng)建時(shí)穿件菜單、工具欄。代碼如下: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圖像銳化處理的實(shí)現(xiàn)通過API函數(shù)獲取位圖資源的二進(jìn)制圖像數(shù)據(jù)。圖像的二進(jìn)制數(shù)據(jù)時(shí)是由圖像每個(gè)像素的R、G、B顏色值組成,通過循環(huán)語句修改每個(gè)像素的顏色值,進(jìn)而達(dá)到銳化的效果。效果截圖以及實(shí)現(xiàn)代碼如下: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++) { //真彩色位圖每個(gè)像素需要3個(gè)字節(jié)表示其顏色 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; //獲取下一個(gè)像素顏色 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(){ //已經(jīng)加載圖像 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)); //寫入位圖實(shí)際數(shù)據(jù) file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關(guān)閉文件 file.Close(); } catch(...) { MessageBox("文件保存失敗!","提示"); } } }}3.3圖像反色處理的實(shí)現(xiàn)反色效果就是將就是將圖像的各像素的RGB分量分別和255相減以后形成的效果。截圖效果和實(shí)現(xiàn)代碼如下: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++) { //真彩色位圖每個(gè)像素需要3個(gè)字節(jié)表示其顏色 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(){ //已經(jīng)加載圖像 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)); //寫入位圖實(shí)際數(shù)據(jù) file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關(guān)閉文件 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圖像平移的實(shí)現(xiàn)先求出原圖個(gè)點(diǎn)的RGP值,平移后所得圖的各點(diǎn)的RGP值是由原圖各點(diǎn)的平移后所得。截圖效果和實(shí)現(xiàn)代碼如下: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("請(qǐng)選擇真彩色位圖!","提示"); return; } if(m_bmInfoHeader.biSizeImage==0) { intexternWidth; //計(jì)算源位圖每行使用的字節(jié)數(shù) 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); //設(shè)置滾動(dòng)范圍 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(){ //已經(jīng)加載圖像 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)); //寫入位圖實(shí)際數(shù)據(jù) file.WriteHuge(m_pBmpData,m_bmInfoHeader.biSizeImage); //關(guān)閉文件 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) //先上移動(dòng) { nY=abs(nY); for(inti=nHeight-nY;i>=0;i--) { BYTE*pCurData=m_pBmpData+nLineBytes*i; //獲取行數(shù)據(jù) //將當(dāng)前行數(shù)據(jù)賦值給上一行數(shù)據(jù) 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) //向下移動(dòng) { for(inti=nY;i<nHeight;i++) { BYTE*pCurData=m_pBmpData+nLineBytes*i; //獲取行數(shù)據(jù) //將當(dāng)前行數(shù)據(jù)賦值給上一行數(shù)據(jù) 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) //向左移動(dòng) { nX=abs(nX); for(inti=0;i<nLineBytes;i++) { BYTE*pCurData=m_pBmpData+i+nX*3; //獲取列數(shù)據(jù) 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) //向右移動(dòng) { for(inti=nLineBytes-(nX*3);i>=0;i--) { BYTE*pCurData=m_pBmpData+i-1; //獲取列數(shù)據(jù) 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圖像縮放處理的實(shí)現(xiàn)圖像縮放主要有兩種,按比例縮放和任意縮放。采用最鄰近插值法主要思想實(shí)際就是四舍五入,將一個(gè)實(shí)數(shù)的坐標(biāo)像素等于與該點(diǎn)最近的圖像像素值。截圖效果和實(shí)現(xiàn)代碼如下: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 //實(shí)際像素 { 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; //位圖行字節(jié)對(duì)齊 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; //設(shè)置滾動(dòng)范圍 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("請(qǐng)選擇真彩色位圖!","提示"); return; } if(m_bmInfoHeader.biSizeImage==0) { intexternWidth; //計(jì)算源位圖每行使用的字節(jié)數(shù) 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; //設(shè)置滾動(dòng)范圍 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(){ //已經(jīng)加載圖像 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)); //寫入位圖實(shí)際數(shù)據(jù) 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(); //關(guān)閉文件 } catch(...) { MessageBox("文件保存失敗!","提示"); } } } }3.6圖像浮雕處理的實(shí)現(xiàn)浮雕效果就是對(duì)圖片上的每一點(diǎn)的像素上進(jìn)行處理。首先循環(huán)遍歷每一點(diǎn)的像素,取像素的R、G、B元素值,把這些元素值減去相鄰像素的元素值后再加上128.元素值的取值在0—255,則超過255的元素復(fù)制為255,小于0的賦值為0,然后將3個(gè)元素的值重新組合起來賦予原來的像素。截圖效果和實(shí)現(xiàn)代碼如下: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++) { //真彩色位圖每個(gè)像素需要3個(gè)字節(jié)表示其顏色 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圖像灰度化處理的實(shí)現(xiàn)在圖像的灰度化過程中,首先需要獲取像素點(diǎn)的紅、綠、藍(lán)分量值,然后將其乘以相應(yīng)的分量,最后重新設(shè)置像素的顏色。截圖效果和實(shí)現(xiàn)代碼如下: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++) { //真彩色位圖每個(gè)像素需要3個(gè)字節(jié)表示其顏色 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《游泳服務(wù)與管理》課件
- 《電力企業(yè)流程管理》課件
- 《電磁輻射及預(yù)防》課件
- 2024年高考生物一輪復(fù)習(xí)必修二第五單元遺傳的基本規(guī)律試題
- 單位管理制度集合大合集【人力資源管理】十篇
- 單位管理制度集粹匯編職員管理篇十篇
- 單位管理制度分享匯編【員工管理】十篇
- 單位管理制度分享大全【人員管理】十篇
- 單位管理制度呈現(xiàn)合集【員工管理】十篇
- 《團(tuán)隊(duì)建設(shè)與發(fā)展》課件
- 2024-2025學(xué)年上學(xué)期深圳初中地理七年級(jí)期末模擬卷3
- 中國(guó)當(dāng)代文學(xué)專題-003-國(guó)開機(jī)考復(fù)習(xí)資料
- 期末測(cè)試卷-2024-2025學(xué)年外研版(一起)英語六年級(jí)上冊(cè)(含答案含聽力原文無音頻)
- 中國(guó)馬克思主義與當(dāng)代思考題(附答案)
- 科技水晶質(zhì)感產(chǎn)品推廣PPT模板
- 化工儀表及自動(dòng)化第六版-課后-答案
- 老化箱點(diǎn)檢表A3版本
- 消防設(shè)施驗(yàn)收移交單
- 光伏發(fā)電項(xiàng)目并網(wǎng)調(diào)試方案
- 教師教學(xué)質(zhì)量評(píng)估表(學(xué)生用)
- 2022年自考4月英語真題帶解析
評(píng)論
0/150
提交評(píng)論