畢業(yè)論文--基于VC++的圖像特效顯示研究_第1頁(yè)
畢業(yè)論文--基于VC++的圖像特效顯示研究_第2頁(yè)
畢業(yè)論文--基于VC++的圖像特效顯示研究_第3頁(yè)
畢業(yè)論文--基于VC++的圖像特效顯示研究_第4頁(yè)
畢業(yè)論文--基于VC++的圖像特效顯示研究_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于VC+的圖像特效顯示研究姓名吉首大學(xué)物理科學(xué)與信息工程學(xué)院,湖南 吉首 416000摘 要圖像的特效顯示在計(jì)算機(jī)技術(shù)領(lǐng)域應(yīng)用廣泛,Windows的屏幕保護(hù)程序就采用了各種各樣的圖像特效顯示,使人感到耳目一新。本論文闡述了基于VC+設(shè)計(jì)圖像特效顯示的根本原理和方法,研究了現(xiàn)有的掃描特效顯示、柵條特效顯示、馬賽克特效顯示,并分析了這些顯示的相關(guān)算法,通過(guò)研究創(chuàng)新設(shè)計(jì)出兩個(gè)特效顯示漸變百葉窗特效和泡泡腐蝕特效,介紹了這兩個(gè)特效顯示的算法實(shí)現(xiàn)及軟件界面的設(shè)計(jì)實(shí)現(xiàn)過(guò)程。關(guān)鍵詞:特效顯示;掃描;柵條;馬賽克;VC+;MFC;GDIResearch on Special Effects Show of

2、Images Based on VC+Guo Dongming(College of Physics Science and Information Engineering, Jishou University, Jishou,Hunan 416000)AbstractSpecial effects show for images is applied in the field of computer technology widely. The Windows screen savers use a variety of image special effects which feel re

3、fresh. This paper describes the basic principles and methods of image special effects show based on VC+. The algorithm of the effect shows including scanning special effect show, bar special effect show and mosaic special effect show are studied. This paper also designes two special effectsGradually

4、 changing blinds and corroding bubble. The implementation of the display algorithm and software interface designment are realized in this paper.Key words: Special effects show; scanning; bar; mosaic; VC + +; MFC; GDI TOC o 1-3 h z u 目 錄 HYPERLINK l _Toc137631313 第一章 緒 論1 HYPERLINK l _Toc137631314 1.

5、1 數(shù)字圖像概述1 HYPERLINK l _Toc137631314 1.2 圖像特效顯示的概念及研究概況1 HYPERLINK l _Toc137631314 1.3 本文的結(jié)構(gòu)及主要的研究2 HYPERLINK l _Toc137631316 第二章 基于VC+圖像顯示的理論根底3 HYPERLINK l _Toc137631317 HYPERLINK l _Toc137631321 2.1 Microsoft Visual C+編程概述3 HYPERLINK l _Toc137631322 2.1.1 Windows程序特點(diǎn)3 HYPERLINK l _Toc137631322 2.1

6、.2 C+語(yǔ)言4 HYPERLINK l _Toc137631322 2.1.3 Microsoft Visual 環(huán)境4 HYPERLINK l _Toc137631322 2.1.4 MFC簡(jiǎn)介5 HYPERLINK l _Toc137631322 2.1.5 圖形設(shè)備接口、GDI對(duì)象5 HYPERLINK l _Toc137631317 HYPERLINK l _Toc137631321 2.2 圖像特效顯示原理6 HYPERLINK l _Toc137631316 第三章 常見(jiàn)的圖像特效顯示9 HYPERLINK l _Toc137631343 掃描顯示9 HYPERLINK l _T

7、oc137631343 3.2 柵條顯示9 HYPERLINK l _Toc137631343 3.3 馬賽克顯示11 HYPERLINK l _Toc137631343 3.4 對(duì)于常見(jiàn)特效顯示算法的改良13 HYPERLINK l _Toc137631341 第四章 兩個(gè)新的圖像特效顯示及VC+界面的設(shè)計(jì)14 HYPERLINK l _Toc137631343 4.1 兩個(gè)特效顯示及其算法14 HYPERLINK l _Toc137631322 4.1.1 漸變百葉窗顯示14 HYPERLINK l _Toc137631322 4.1.2 泡泡腐蝕顯示17 HYPERLINK l _Toc

8、137631343 4.2 VC+程序界面設(shè)計(jì)20 HYPERLINK l _Toc137631322 4.2.1 CDC類(lèi)的派生類(lèi)設(shè)計(jì)20 HYPERLINK l _Toc137631322 4.2.2 CDialog類(lèi)的派生類(lèi)的成員函數(shù)設(shè)計(jì)21 HYPERLINK l _Toc137631322 4.2.3 根本窗口設(shè)計(jì)22 HYPERLINK l _Toc137631343 4.3 測(cè)試分析及總結(jié)23 HYPERLINK l _Toc137631341 第五章 結(jié) 語(yǔ)25 HYPERLINK l _Toc137631347 參考文獻(xiàn)26緒 論1.1 數(shù)字圖像概述 數(shù)字圖像可以看成一個(gè)矩陣

9、,或一個(gè)二維數(shù)組,這是在計(jì)算機(jī)上表示的方式。形象的說(shuō)一幅數(shù)字圖像就像縱橫交錯(cuò)的棋盤(pán),棋盤(pán)行和列的數(shù)目就表示圖像的大小,棋盤(pán)的格子就是圖像的根本元素,稱(chēng)為像素。對(duì)于彩色圖像,數(shù)字圖像的顯示必須從三原色RGB概念說(shuō)起。眾所周知,自然界中的所有顏色都可以由紅綠藍(lán) (R、G、B)三原色組合而成。有的顏色含有紅色成分多一些,其他成分少一些。針對(duì)含有紅色成分的多少,可以人為地分成0到255共256個(gè)等級(jí),0級(jí)表示不含紅色成分,255級(jí)表示含有100%的紅色成分。同樣,綠色和藍(lán)色也可以被分成256級(jí)。這樣,根據(jù)紅、綠、藍(lán)各種不同的組合我們就能表示出256*256*256(約1600萬(wàn))種顏色1。當(dāng)一幅圖中每

10、個(gè)像素被賦予不同的RGB值時(shí),就能呈現(xiàn)出五彩繽紛的顏色了,這就形成了彩色圖像。灰度圖像是指只含亮度信息,不含色彩信息的圖像,就像平時(shí)看到亮度由暗到明的黑白照片,變化是連續(xù)的。因此,要表示灰度圖,就需要把亮度值進(jìn)行量化。通常劃分成0到255共256個(gè)級(jí)別,0級(jí)表示最暗(全黑),255級(jí)表示最亮(全白)。1.2 圖像特效顯示的概念及研究概況 靜態(tài)的圖像顯示就是把一幅圖像輸出到顯示區(qū)域,該區(qū)域很迅速的呈現(xiàn)出整副圖像,而圖像的特效顯示,那么把圖像以一定連貫的順序分局部的輸出到顯示區(qū)域,在輸出的過(guò)程中參加一定的時(shí)間延時(shí),在人眼的視覺(jué)中產(chǎn)生一個(gè)連續(xù)變幻并逐漸形成一幅完整圖像的效果。在顯示過(guò)程中可以采用將圖

11、像從物理上分割成小像素塊的方法,也可以是顯示時(shí)將圖像的每個(gè)像素點(diǎn)色彩從另一個(gè)色彩連續(xù)的變化過(guò)來(lái)的方法。百頁(yè)窗、掃描、柵條、馬賽克、和漸顯漸隱顯示等效果都是現(xiàn)在比擬流行的圖像特效顯示,其算法相對(duì)簡(jiǎn)單但視覺(jué)效果相當(dāng)美觀,因此廣泛應(yīng)用于數(shù)碼、影視、廣告、多媒體等大局部與圖像顯示相關(guān)的領(lǐng)域。圖像特效顯示變化靈活多樣,在設(shè)計(jì)時(shí)更是可以靈活的運(yùn)用程序的控制,實(shí)現(xiàn)更多創(chuàng)新的想法,這樣使用程序算法靈活的控制特效顯示便成了主要設(shè)計(jì)工作。某些特效顯示,如掃描算法是沒(méi)有確定算法的,只要實(shí)現(xiàn)掃描過(guò)程的視覺(jué)特效即可,對(duì)這些常用特效也可通過(guò)與其他特效的組合成別的特效。1.3 本文的結(jié)構(gòu)及主要的研究在論文的組織和安排上,本

12、論文按照內(nèi)容分為五章:,講述了圖像的相關(guān)概念以及圖像特效顯示的概念和概況;,介紹了圖像特效顯示的原理以及基于VC+程序設(shè)計(jì)的理論知識(shí);,研究了目前常用的圖像特效顯示掃描顯示、柵條顯示和馬賽克顯示的算法,分析其算法及其實(shí)現(xiàn)的效果,對(duì)這些算法提出創(chuàng)新修改思路,并在設(shè)計(jì)中予以完成;,研究了新設(shè)計(jì)的漸變百葉窗特效顯示和泡泡腐蝕特效顯示的設(shè)計(jì)思路和算法實(shí)現(xiàn),并完成基于VC+的程序窗口界面設(shè)計(jì),對(duì)設(shè)計(jì)進(jìn)行測(cè)試和分析提出了改良方案;,對(duì)本論文進(jìn)行了總結(jié),對(duì)遇到的問(wèn)題提出相應(yīng)的改良方案,給出設(shè)計(jì)更出色的特效顯示的研究方向?;赩C+圖像顯示的理論根底 本章將介紹Windows下Visual C+數(shù)字圖像編程的

13、根底知識(shí),它是后面章節(jié)編程研究的根底。主要介紹的內(nèi)容包括Windwos程序的特點(diǎn)、C+程序設(shè)計(jì)語(yǔ)言的特點(diǎn)、環(huán)境的特點(diǎn)、基于MFC編程的特點(diǎn)、圖形設(shè)備接口與GDI的概念、圖像特效顯示的原理,以及在編寫(xiě)特效算法時(shí)用到的圖像操作函數(shù)。 2.1 Microsoft Visual C+編程概述2.1.1 Windows程序特點(diǎn) Windows 是一個(gè)“基于事件的,消息驅(qū)動(dòng)的操作系統(tǒng)。在Windows下執(zhí)行一個(gè)程序,只要用戶(hù)進(jìn)行了影響窗口的動(dòng)作如改變窗口大小或移動(dòng)、單擊鼠標(biāo)等該動(dòng)作就會(huì)觸發(fā)一個(gè)相應(yīng)的“事件。系統(tǒng)每次檢測(cè)到一個(gè)事件時(shí),就會(huì)給程序發(fā)送一個(gè)“消息,從而使程序可以處理該事件。每個(gè)Windows 應(yīng)

14、用程序都是基于事件和消息的,而且包含一個(gè)主事件循環(huán),它不停地、反復(fù)地檢測(cè)是否有用戶(hù)事件發(fā)生。每次檢測(cè)到一個(gè)用戶(hù)事件,程序就對(duì)該事件做出響應(yīng),處理完再等待下一個(gè)事件的發(fā)生。Windows 下的應(yīng)用程序不斷地重復(fù)這一過(guò)程,直至用戶(hù)終止程序,用代碼來(lái)描述實(shí)際上也就是一個(gè)消息處理過(guò)程的while循環(huán)語(yǔ)句。系統(tǒng)隊(duì)列應(yīng)用程序隊(duì)列應(yīng)用程序隊(duì)列窗口函數(shù)1窗口函數(shù)y窗口函數(shù)1窗口函數(shù)x應(yīng)用程序nWinMain函數(shù)不WinMain函數(shù)不消息循環(huán)消息循環(huán)用戶(hù)輸入圖2.1 Windows應(yīng)用程序與消息模型Windows應(yīng)用程序與消息的關(guān)系如下圖,Windows操作系統(tǒng)為每一個(gè)正在運(yùn)行的應(yīng)用程序保持有一個(gè)消息隊(duì)列消息循

15、環(huán)。當(dāng)有事件發(fā)生后,Windows并不是將這個(gè)激發(fā)事件直接送給應(yīng)用程序,而是先將其翻譯成一個(gè)Windows消息,然后再把這個(gè)消息參加到這個(gè)應(yīng)用程序的消息隊(duì)列中去。應(yīng)用程序需要通過(guò)消息循環(huán)來(lái)接收這些消息,接收到的消息經(jīng)過(guò)主程序的提取判斷后調(diào)用相應(yīng)的消息處理函數(shù)以完成對(duì)事件的處理。消息隊(duì)列是系統(tǒng)用來(lái)存放各種消息的地方,Windows操作系統(tǒng)有一個(gè)消息隊(duì)列,各個(gè)應(yīng)用程序也有自己的消息隊(duì)列。 Windows系統(tǒng)把消息發(fā)送給窗口過(guò)程,窗口過(guò)程有4個(gè)參數(shù):窗口句柄、消息標(biāo)識(shí)以及兩個(gè)叫做消息參數(shù)的32位值。窗口句柄決定消息發(fā)送到哪一個(gè)窗口,Windows系統(tǒng)那么用它來(lái)確定向哪一個(gè)窗口過(guò)程發(fā)送消息。消息標(biāo)識(shí)是

16、一個(gè)命名的常量,由它來(lái)標(biāo)識(shí)消息的目的。如果窗口過(guò)程接收到一條消息,它就通過(guò)消息標(biāo)識(shí)來(lái)決定如何處理這條消息。2.1.2 C+語(yǔ)言 C+語(yǔ)言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言,它在C語(yǔ)言的根底上開(kāi)展而來(lái),但它比C語(yǔ)言更容易為人們學(xué)習(xí)和掌握13。面向?qū)ο蟮脑O(shè)計(jì)思想是在原來(lái)結(jié)構(gòu)化程序設(shè)計(jì)方法根底上的一個(gè)質(zhì)的飛躍,C+完美地表達(dá)了面向?qū)ο蟮母鞣N特性。面對(duì)對(duì)象設(shè)計(jì)語(yǔ)言在軟件開(kāi)發(fā)上有很多優(yōu)點(diǎn),主要表達(dá)在:(1)易維護(hù),采用面向?qū)ο笏枷朐O(shè)計(jì)的結(jié)構(gòu);(2)可讀性高,由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊,所以維護(hù)起來(lái)是非常方便和較低本錢(qián)的;(3)質(zhì)量高,在設(shè)計(jì)時(shí),可重用現(xiàn)有的,在以前的工程的領(lǐng)域中

17、已被測(cè)試過(guò)的類(lèi)使系統(tǒng)滿(mǎn)足業(yè)務(wù)需求并具有較高的質(zhì)量;(4)效率高,在軟件開(kāi)發(fā)時(shí),根據(jù)設(shè)計(jì)的需要對(duì)現(xiàn)實(shí)世界的事物進(jìn)行抽象,產(chǎn)生類(lèi)。使用這樣的方法解決問(wèn)題,接近于日常生活和自然的思考方式,勢(shì)必提高軟件開(kāi)發(fā)的效率和質(zhì)量;(5)易擴(kuò)展,由于繼承、封裝、多態(tài)的特性,自然設(shè)計(jì)出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活、更容易擴(kuò)展,而且本錢(qián)較低。 C+的設(shè)計(jì)目標(biāo),就是要讓C+既具有適合于系統(tǒng)程序設(shè)計(jì)的C語(yǔ)言所具有的可適應(yīng)性和高效性,又能在其程序組織結(jié)構(gòu)方面具有像SimulaSimula所支持的這種程序組織結(jié)構(gòu)通常被稱(chēng)為面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格那樣的語(yǔ)言設(shè)施。C+語(yǔ)言同時(shí)做了很多優(yōu)化工作,使得引借自Simula的高

18、層次的程序設(shè)計(jì)技術(shù)能夠應(yīng)用于系統(tǒng)程序設(shè)計(jì)之中。這即是說(shuō),C+所提供的抽象機(jī)制能夠被應(yīng)用于那些對(duì)效率和可適應(yīng)性具有極高要求的程序設(shè)計(jì)任務(wù)之中。 環(huán)境 是Microsoft公司開(kāi)發(fā)的基于C/C+的集成開(kāi)發(fā)工具,它是Visual Studio中功能最為強(qiáng)大、代碼效率最高的開(kāi)發(fā)工具11。用戶(hù)可以利用以?xún)煞N方式編寫(xiě)Win32應(yīng)用程序,一種方式是基于Windows API的C+編程方式,另一種是基于MFC的C+編程方式。 Visual C+為用戶(hù)提供了一個(gè)可視化、通用的應(yīng)用程序集成開(kāi)發(fā)環(huán)境DeveloperStudio(也俗稱(chēng)Visual Studio)。Developer Studio包含了一個(gè)文本編輯

19、器、資源編輯器、工程編譯工具、一個(gè)增量連接器、源代碼瀏覽器、集成調(diào)試工具以及一套聯(lián)機(jī)文檔(MSDN)。Developer Studio 采用標(biāo)準(zhǔn)的多窗口用戶(hù)界面,提供了大量實(shí)用工具以支持可視化編程的特性,包括工程工作區(qū)、AppWizard(應(yīng)用程序向?qū)?、ClassWizard(類(lèi)向?qū)?、WizardBar(向?qū)Чぞ邨l)、Component Gallery(組件畫(huà)廊)等。通過(guò)Developer Studio,開(kāi)發(fā)人員可以完成工程工程的創(chuàng)立、程序的編輯、修改、運(yùn)行和調(diào)試等各種操作。 MFC簡(jiǎn)介MFCMicrosoft Foundation Class是Windows API(Applicatio

20、n Programming Interface,應(yīng)用程序編程接口,是一套用來(lái)控制Windows的各個(gè)部件的外觀和行為的一套預(yù)先定義的Windows函數(shù))與C+的一個(gè)結(jié)合2。 Windows系統(tǒng)功能強(qiáng)大,因此直接應(yīng)用API函數(shù)庫(kù)編制應(yīng)用程序,需要掌握大量的API函數(shù)以及其比擬煩瑣的使用方法,這無(wú)疑加重了許多開(kāi)發(fā)者的負(fù)擔(dān)。MFC是一個(gè)微軟提供的根底類(lèi)庫(kù),它做了大量的工作,封裝API的同時(shí),隱藏了使用C+及API編制軟件的大量細(xì)節(jié),因此對(duì)于程序開(kāi)發(fā)者,用MFC會(huì)比直接用Windows的API來(lái)得容易一些。MFC中還提供了很好的應(yīng)用程序框架,它的目的就是讓程序員在此根底上來(lái)建立Windows下的應(yīng)用程

21、序,這是一種相對(duì)SDK(Software Development Kit 軟件開(kāi)發(fā)工具包)來(lái)說(shuō)更為簡(jiǎn)單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶(hù)接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過(guò)預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Microsoft Visual C+提供了相應(yīng)的工具來(lái)完成這個(gè)工作:AppWizard可以用來(lái)生成初步的框架文件代碼和資源等;資源編輯器用于幫助直觀地設(shè)計(jì)用戶(hù)接口;ClassWizard用來(lái)協(xié)助添加代碼到框架文件。當(dāng)然,這種在軟件開(kāi)發(fā)之前設(shè)計(jì)好的框架是以方便為目的的,必定要付出一定的代價(jià),因此就造成了MFC對(duì)類(lèi)封裝中的一定程度的冗余和迂回

22、,但這對(duì)于本次設(shè)計(jì)要求是可以接受的。 圖形設(shè)備接口、GDI對(duì)象 以往許多MSDOS程序采用直接向視頻存儲(chǔ)區(qū)或打印機(jī)端口輸送數(shù)據(jù),這種做法不利之處是需要各種顯示卡(低分辨率彩色圖形顯示卡、加強(qiáng)圖形顯示卡、圖像圖形陣列以及VGA)或打印機(jī)驅(qū)動(dòng)程序,支持所有這些設(shè)備意味著要用大量的編程來(lái)包含這些驅(qū)動(dòng)程序(為每一個(gè)設(shè)備編定不同的代碼)。為了減輕開(kāi)發(fā)程序的難度,Windows提供了一個(gè)抽象的接口,圖形設(shè)備接口Graphics Device Interface(GDI)。另外Windows還提供了各種顯示卡及打印機(jī)的驅(qū)動(dòng)程序,這樣在寫(xiě)程序時(shí)就可以不必關(guān)心顯示卡和打印機(jī)的類(lèi)型,簡(jiǎn)化了程序開(kāi)發(fā)的難度。GDI是

23、個(gè)抽象的概念,GDI接口是微軟公司提供的一組繪圖函數(shù),通常稱(chēng)之為GDI函數(shù),使用這些函數(shù)可以繪制各種圖形。MFC類(lèi)庫(kù)對(duì)GDI函數(shù)進(jìn)行封裝,將其封裝為不同的GDI對(duì)象,采用GDI對(duì)象進(jìn)一步簡(jiǎn)化了圖形、圖像處理程序的開(kāi)發(fā)難度。常用到的GDI對(duì)象有: 1.CPen:筆是一種用來(lái)畫(huà)線(xiàn)及繪制有形邊框的工具,可以指定它的顏色及厚度,并且可以指定它畫(huà)實(shí)線(xiàn)、點(diǎn)線(xiàn)或虛線(xiàn); 2.CBrush:刷子定義了一種位圖形式的像素,利用它可對(duì)區(qū)域內(nèi)部填充顏色; 3.CBitmap:位圖是一種位矩陣,每一個(gè)顯示像素都對(duì)應(yīng)于其中的一個(gè)或多個(gè)位??梢岳梦粓D來(lái)表示圖像,也可以利用它來(lái)創(chuàng)立刷子; 4.CRgn:區(qū)域是由多邊形、橢圓

24、或二者組合形成的一種范圍,可以利用它來(lái)填充、裁剪以及鼠標(biāo)點(diǎn)中測(cè)試; 5.CFont:字體是一種具有某種風(fēng)格和尺寸的所有字符的完整集合,它常常被當(dāng)作資源存于磁盤(pán)中,其中有一些還依賴(lài)于某種設(shè)備; 6.CPalette:調(diào)色板是一種顏色映射接口,它允許應(yīng)用程序在不干擾其他應(yīng)用程序的前提下,充分利用輸出設(shè)備的顏色描繪能力。2.2 圖像特效顯示原理圖像特效顯示主要是通過(guò)對(duì)一幅分成許多小塊的圖像的控制使其在一定順序的時(shí)間序列上顯示到設(shè)計(jì)備(這里主要是屏幕)上,最終完成整圖的顯示,當(dāng)其變化的效果在時(shí)間上到達(dá)一定速度圖像顯示順序相對(duì)連貫時(shí),在人的視覺(jué)上產(chǎn)生變化的圖像顯示效果。CDC類(lèi)是設(shè)備上下文對(duì)象的基類(lèi),它

25、提供了處理顯示器或打印機(jī)等設(shè)備的方法,它可以進(jìn)行繪圖操作,設(shè)置繪制對(duì)象的顏色、大小等屬性,并將繪制的圖形輸出到顯示器或打印機(jī)上。CDC類(lèi)就像一個(gè)畫(huà)板,為GDI對(duì)象提供顯示的空間。圖像的顯示在本論文中主要通過(guò)CDC中BitBlt()和StretchDIBits等函數(shù)來(lái)完成,去除那么由CPen等對(duì)象畫(huà)不同的空白圖形完成。需要注意的是,在特效顯示時(shí),并不是每個(gè)顯示函數(shù)都適宜,BitBlt()函數(shù)主要是用來(lái)顯示整幅圖像,后面一個(gè)函數(shù)用來(lái)進(jìn)行圖像的縮放顯示,因此BitBlt()使用起來(lái)較死板,遠(yuǎn)不如StretchDIBits用的靈活,并且對(duì)大多數(shù)的特效顯示無(wú)能為力,所以為了實(shí)現(xiàn)圖像的特效顯示效果,需要使

26、用StretchDIBits函數(shù)來(lái)顯示圖像。而在圖像顯示過(guò)程中的時(shí)間延時(shí)效果那么采用Sleep()函數(shù)完成。 CDC類(lèi)的成員函數(shù)有很多,本論文中只研究涉及到的幾個(gè)函數(shù): 1.BitBlt 函數(shù)功能:該函數(shù)對(duì)指定的源設(shè)備環(huán)境區(qū)域中的像素進(jìn)行位塊bit_block轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境。 函數(shù)原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop); 參數(shù): hdcDest:指向目標(biāo)設(shè)備環(huán)境的句柄。 nXDest:指定目標(biāo)

27、矩形區(qū)域左上角的X軸邏輯坐標(biāo)。 nYDest:指定目標(biāo)矩形區(qū)域左上角的Y軸邏輯坐標(biāo)。 nWidth:指定源和目標(biāo)矩形區(qū)域的邏輯寬度。 nHeight:指定源和目標(biāo)矩形區(qū)域的邏輯高度。 hdcSrc:指向源設(shè)備環(huán)境的句柄。 nXSrc:指定源矩形區(qū)域左上角的X軸邏輯坐標(biāo)。 nYSrc:指定源矩形區(qū)域左上角的Y軸邏輯坐標(biāo)。 dwRop:指定光柵操作代碼。這些代碼將定義源矩形區(qū)域的顏色數(shù)據(jù),如何與目標(biāo)矩形區(qū)域的顏色數(shù)據(jù)組合以完成最后的顏色。 返回值:如果函數(shù)成功,那么返回值非零;如果函數(shù)失敗,那么返回值為零。 2.CreateCompatibleDC 函數(shù)功能:該函數(shù)創(chuàng)立一個(gè)與指定設(shè)備兼容的內(nèi)存設(shè)備

28、上下文環(huán)境CDC。 函數(shù)原型:HDC CreateCompatibleDC(HDC hdc); 參數(shù): hdc:現(xiàn)有設(shè)備上下文環(huán)境的句柄,如果該句柄為NULL,該函數(shù)創(chuàng)立一個(gè)與應(yīng)用程序的當(dāng)前顯示器兼容的內(nèi)存設(shè)備上下文環(huán)境。返回值:如果成功,那么返回內(nèi)存設(shè)備上下文環(huán)境的句柄;如果失敗,那么返回值為NULL。 3.StretchBlt 函數(shù)功能:函數(shù)從源矩形中復(fù)制一個(gè)位圖到目標(biāo)矩形,必要時(shí)按目前目標(biāo)設(shè)備設(shè)置的模式進(jìn)行圖像的拉伸或壓縮。 函數(shù)原型:BOOL StretchBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDe

29、st, int nHeighDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, DWORD dwRop); 參數(shù):hdcDest:指向目標(biāo)設(shè)備環(huán)境的句柄。 nXOriginDest:指定目標(biāo)矩形左上角的X軸坐標(biāo),按邏輯單位表示坐標(biāo)。 nYOriginDest:指定目標(biāo)矩形左上角的X軸坐標(biāo),按邏輯單位表示坐標(biāo)。 nWidthDest:指定目標(biāo)矩形的寬度,按邏輯單位表示寬度。 nHeightDest:指定目標(biāo)矩形的高度,按邏輯單位表示高茺。 hdcSrc:指向源設(shè)備環(huán)境的句柄。 nXO

30、riginSrc:指向源矩形區(qū)域左上角的X軸坐標(biāo),按邏輯單位表示坐標(biāo)。 nYOriginSrc:指向源矩形區(qū)域左上角的Y軸坐標(biāo),按邏輯單位表示坐標(biāo)。 nWidthSrc:指定源矩形的寬度,按邏輯單位表示寬度。 nHeightSrc:指定源矩形的高度,按邏輯單位表示高度。 dwRop:指定要進(jìn)行的光柵操作。光柵操作碼定義了系統(tǒng)如何在輸出操作中組合顏色,這些操作包括刷子、源位圖和目標(biāo)位圖等對(duì)象。返回值:如果函數(shù)執(zhí)行成功,返回值為非零,如果函數(shù)執(zhí)行失敗返回值為零。 常見(jiàn)的圖像特效顯示本章主要研究了目前比擬流行的圖像特效顯示中的掃描顯示、百葉窗顯示、馬賽克顯示效果,分析其實(shí)用性并對(duì)相關(guān)算法進(jìn)行優(yōu)化改良

31、。3.1 掃描顯示掃描顯示圖像是最根本的特效顯示方法,可以分為上下左右四個(gè)方向的掃描顯示,對(duì)于向下的顯示它表現(xiàn)為圖像一行一行的從最頂端開(kāi)始顯示圖像直到整個(gè)圖像顯示出來(lái),效果有點(diǎn)像拉幕布的感覺(jué)。其實(shí)現(xiàn)方法為:取圖像最上面一行像素點(diǎn)顯示出來(lái),再加上時(shí)間延遲,再取剩下的圖像局部中的最上面一行,如此循環(huán),直至整個(gè)加載入設(shè)備內(nèi)存中的圖像顯示完成。 其關(guān)鍵實(shí)現(xiàn)代碼如下:int SleepTime=20; int temp=10; for(UINT y=0;yStretchBlt(IncX, IncY+y, /顯示在設(shè)備上的起點(diǎn)x,y坐標(biāo) bs.bmWidth,temp, /顯示在設(shè)備上的寬度和高度 &dc

32、, /源位圖設(shè)備情境對(duì)象 0, y, /提取源位圖中顯示區(qū)起點(diǎn)x,y坐標(biāo) bs.bmWidth,1,/提取源位圖像素寬高 SRCCOPY);顯示模式 Sleep(SleepTime);/時(shí)間延遲 SleepTime默認(rèn)為20掃描顯示運(yùn)行效果圖如圖3.1所示。 3.2 柵條顯示 柵條顯示即交錯(cuò)顯示。垂直交錯(cuò)效果表現(xiàn)為:設(shè)備上端下端各出現(xiàn)一幅由橫向線(xiàn)條組成的圖像相對(duì)移動(dòng),直至兩圖像剛好重疊成一幅完整清晰的圖像。 其實(shí)現(xiàn)方法為:分別取待顯示位圖的奇數(shù)行和偶數(shù)行做為向上和向下的兩幅圖,分別向上和向下移動(dòng),直至顯示到待定的位置,此時(shí)兩圖剛好組合成一幅完整的圖像。圖3.1 掃描特效顯示運(yùn)行效果圖 垂直柵條

33、實(shí)現(xiàn)代碼如下: int i,j;int buf=1;/柵條的高度 取奇數(shù)跟偶數(shù)號(hào)行時(shí)用1int SleepTime=10;/時(shí)間延遲f*buf); int temp_height= bs.bmHeight-low_height-(bs.bmHeight/buf-bs.bmHeight/buf/2*2)*buf; /當(dāng)buf!=1時(shí) 取偶數(shù)根buf高度像素條后剩下的最小高度 /用于放置在最下面到最后顯示出來(lái) 使不影響整體效果if(low_height0)ow_height,bs.bmWidth, low_height, &dc,0,0,bs.bmWidth,low_height,SRCCOPY)

34、, Sleep(speed*buf);/對(duì)上面提及的low_height高度像素條區(qū)域置圖像for(i=1;i=1;j-)Width,buf, &dc,0,(bs.bmHeight/buf/2-i)*2*buf+(j-1)*2*buf,bs.bmWidth,buf,SRCCOPY);this-StretchBlt(IncX,IncY+temp_height-(2*j-1)*buf,bs.bmWidth,buf, &dc, 0,(i-j)*2*buf+buf,bs.bmWidth,buf,SRCCOPY); /對(duì)上下出現(xiàn)的柵條進(jìn)行相對(duì)移動(dòng) this-StretchBlt(IncX,IncY+bs

35、.bmHeight-low_height, bs.bmWidth,low_height, &dc, 0,i*2*buf,bs.bmWidth,low_height,SRCCOPY); /對(duì)由于buf!=1時(shí)產(chǎn)生的圖像最后空隙進(jìn)行填補(bǔ) /填補(bǔ)的高度與上面的buf不同Sleep(SleepTime*buf);this-BitBlt(IncX,IncY,bs.bmWidth,bs.bmHeight,&dc,0,0,SRCCOPY);/對(duì)整個(gè)圖像顯示的最后一次產(chǎn)生的空隙進(jìn)行填補(bǔ)柵條顯示運(yùn)行效果圖如圖3.2所示:圖3.2 柵條特效顯示運(yùn)行效果圖3.3 馬賽克顯示 馬賽克顯示是指圖像被分成許多的小塊,它們

36、以隨機(jī)的次序顯示出來(lái),直到圖像顯示完畢。實(shí)現(xiàn)馬賽克的效果主要解決的問(wèn)題是如何定義顯示隨機(jī)序列的小方塊。這個(gè)問(wèn)題的解決可以在定義過(guò)小方塊的根底上,用一個(gè)數(shù)組來(lái)記錄各個(gè)方塊的左上角的坐標(biāo)的位置。顯示圖像過(guò)程中,產(chǎn)生一個(gè)隨機(jī)數(shù)來(lái)挑選即將顯示的小方塊,顯示后將該方塊的位置坐標(biāo)從數(shù)組中剔除。去除過(guò)程與之相仿。剔除顯示過(guò)的方塊的位置坐標(biāo)的方法是將該數(shù)組中的最后的一個(gè)點(diǎn)的坐標(biāo)拷貝到當(dāng)前位置,然后刪除數(shù)組中的最后點(diǎn)的坐標(biāo),經(jīng)過(guò)實(shí)踐發(fā)現(xiàn)這樣的處理有時(shí)顯示的圖像是不完整的,分析其原因是生成隨機(jī)數(shù)的過(guò)程有舍入溢出誤差。而且由于出現(xiàn)的圖像大小不一定,當(dāng)把圖像分成一定個(gè)數(shù)像素塊時(shí)每次顯示的像素塊大小不一,出現(xiàn)顯示圖像不

37、完整的情況。同時(shí)為了擴(kuò)展其功能,使用戶(hù)可以設(shè)置不同需要的像素塊大小,在本次設(shè)計(jì)中采用了動(dòng)態(tài)數(shù)組用來(lái)保存當(dāng)前像素塊的左上角坐標(biāo),以表示是否像素塊已經(jīng)顯示過(guò),對(duì)圖像邊緣像素塊對(duì)應(yīng)顯示大小進(jìn)行計(jì)算。修改后實(shí)現(xiàn)代碼如下: int SleepTime=5; int width_buf=10;/馬賽克寬度高度 以下兩個(gè)為橫豎像素塊的個(gè)數(shù) int num_width=bs.bmWidth/width_buf; if(bs.bmWidth-bs.bmWidth/width_buf*width_buf)0)num_width+;int num_height=bs.bmHeight/width_buf; if(b

38、s.bmHeight-bs.bmHeight/width_buf*width_buf)0)num_height+; int num_total=num_width*num_height;/馬賽克總數(shù)short *rxy=(short*)malloc(num_total*sizeof(short);/記錄數(shù)組if(!rxy)return false;/分配內(nèi)存不成功 for(int i=0;i0 & x=num_width-1) buf_x=bs.bmWidth-bs.bmWidth/width_buf*width_buf; /應(yīng)該顯示的像素塊寬if(bs.bmHeight-bs.bmHeigh

39、t/ width_buf*width_buf)0 & y=num_height-1) buf_y=bs.bmHeight-bs.bmHeight/width_buf*width_buf; /應(yīng)該顯示的像素塊高this-StretchBlt(IncX+x*width_buf,IncY+y*width_buf,buf_x,buf_y,&dc, x*width_buf,y*width_buf,buf_x,buf_y,SRCCOPY);num_dis+;/已經(jīng)顯示過(guò)的數(shù)目if(num_dis=num_total)break;Sleep(SleepTime);free(rxy);rxy=NULL;/釋放

40、內(nèi)存 馬賽克顯示運(yùn)行效果圖如圖3.3所示:圖3.3 馬賽克特效顯示運(yùn)行效果圖3.4 對(duì)于常見(jiàn)特效顯示算法的改良掃描、柵條、馬賽克等較為常見(jiàn)的特效顯示其實(shí)現(xiàn)都是比擬簡(jiǎn)單的,易于實(shí)現(xiàn)卻有比擬美觀的效果,能夠廣泛的應(yīng)用于各多媒體中,但假設(shè)需要顯示的圖像大小改變時(shí),會(huì)出現(xiàn)不理想的顯示效果。本次設(shè)計(jì),對(duì)上面幾種特效進(jìn)行了修改,在算法中使用通用的參數(shù)使算法更靈活實(shí)用,這樣可以應(yīng)對(duì)不同分辨率圖像以及可以由用戶(hù)設(shè)定各顯示參數(shù)。具體實(shí)現(xiàn)是:在掃描顯示中定義SleepTime、temp兩個(gè)變量分別表示時(shí)間延遲和在掃描頭部模糊帶寬,以加強(qiáng)掃描條整個(gè)動(dòng)畫(huà)效果的動(dòng)感效果;在柵條顯示中定義SleepTime、buf兩個(gè)變

41、量分別表示時(shí)間延遲和柵條寬度以應(yīng)對(duì)不同分辯率圖像或不同要求的顯示;在馬賽克顯示中參加SleepTime、buf分別表示時(shí)間延遲和馬賽克塊寬度,用以解決設(shè)置簡(jiǎn)單的固定寬度面對(duì)不同的分辨率的圖像時(shí)會(huì)出現(xiàn)邊緣無(wú)法顯示的現(xiàn)象。同時(shí)本次設(shè)計(jì)時(shí)在圖像邊緣顯示時(shí)采用特殊算法,使整個(gè)圖像能完整顯示。修改后的算法在靈活性上有了很大的改良,程序運(yùn)行產(chǎn)生的顯示效果也有所改良,總體上是很成功的。兩個(gè)新的圖像特效顯示及VC+界面的設(shè)計(jì)在本章對(duì)兩個(gè)新的圖像特效顯示漸變百葉窗特效和泡泡腐蝕特效,設(shè)計(jì)出它們的顯示方法和算法,并實(shí)現(xiàn)基于VC+的程序界面的設(shè)計(jì)。通過(guò)實(shí)驗(yàn)分析圖像特效顯示最終效果,提出待改良之處。4.1 兩個(gè)特效顯

42、示及其算法 漸變百葉窗顯示 漸變百葉窗效果是本次設(shè)計(jì)的特效顯示之一,漸變百葉窗特效顯示效果的設(shè)計(jì)與百葉窗效果有相似之處,都是將整圖分成多個(gè)像素條后,各像素條進(jìn)行掃描顯示,百葉窗是相對(duì)簡(jiǎn)單的效果之一,而漸變百葉窗顯示在多媒體網(wǎng)頁(yè)及其它地方的新聞圖片的過(guò)渡效果中有很多類(lèi)似或相同的效果,它們?cè)诒葦M美觀實(shí)用,但其算法卻不盡相同,這里設(shè)計(jì)的是根椐其中一個(gè)效果研究出來(lái)的算法。特效顯示算法描述:在橫向向右的顯示特效中,圖像被分成N等份或由于不能等分成N份使得最后一份稍小豎條,顯示從最左端開(kāi)始每次顯示一個(gè)單位像素的寬度豎條,高度為圖像高度,第一步顯示第一格的左邊第一像素條,第二步顯示第一格的左邊第二像素條同時(shí)

43、顯示第二格的左邊第一像素條,第三步顯示第一格左邊第三像素條、第二格左邊第二像素條和第三格左邊第一像素條,每一步都加上時(shí)間延遲,如此循環(huán)下去,直到最后一格最后一像素條顯示完成。對(duì)于等分成的N格,每條都有M像素條,所以當(dāng)顯示運(yùn)行一小段時(shí)間后保持運(yùn)行變化的格數(shù)最多只有M格,這樣整體顯示就像從左到右依次的拉動(dòng)窗簾一樣的效果,所以其關(guān)鍵算法圖4.1 漸變百葉窗顯示的x值數(shù)列只要取得第i步應(yīng)該顯示的像素條的x坐標(biāo),對(duì)于寬度為100像素的圖,將它分成10份顯示時(shí)每一步顯示的像素條位置應(yīng)如4.1圖所示。漸變百葉窗顯示算法流程如4.2圖所示:開(kāi)始初始化步數(shù)i、每格像素寬buf所有圖像顯示完成?運(yùn)算取得此步顯示的

44、最左一條像素條取得從最左像素條開(kāi)始的其它應(yīng)該顯示的像素條k第k條像素條應(yīng)該顯示?調(diào)用顯示函數(shù)顯示第k像素條返回NYNY步數(shù)自加圖4.2 漸變百葉窗顯示的算法流程圖 漸變百葉窗算法實(shí)現(xiàn)關(guān)鍵代碼如下: const int buf=15;/定義每等份格的像素寬度 int i=0; /整體運(yùn)行的步數(shù) int Single,Rate;/定義Single,Rate,使得Single+Rate*buf為第i步顯示的最 /左一條像素條x坐標(biāo) 再由此x坐標(biāo)可計(jì)算得第二、三.條的坐標(biāo)while(1)if(i=bs.bmWidth)break;/運(yùn)算所得x坐標(biāo)超出圖寬度if(k-j)/(buf-1)j)break;

45、 /jbuf)break; /j=buf時(shí)一步顯示格數(shù)不能超過(guò)buf格,而且計(jì)算坐標(biāo)將不正確 this-StretchBlt(IncX+k,IncY,1,bs.bmHeight, &dc, k,0,1,bs.bmHeight,SRCCOPY );/顯示第k坐標(biāo)條像素條 /IncX,IncY為傳遞進(jìn)來(lái)的圖像顯示左上點(diǎn)坐標(biāo)Sleep(50);/時(shí)間延時(shí)if(j=bs.bmWidth)break;/圖像顯示完成i+;/步數(shù)自加圖4.3 漸變百葉窗顯示運(yùn)行效果圖 算法只是用到稍為復(fù)雜的數(shù)字運(yùn)算而不用另設(shè)如數(shù)組隊(duì)列等輔助手段,這樣使運(yùn)行速度得以加快,但這樣的算法將難以理解。假設(shè)將buf設(shè)為10,理順后再

46、把整個(gè)數(shù)字系統(tǒng)想像為buf進(jìn)制那么更容易理解,而且降低調(diào)試難度。漸變百葉窗顯示運(yùn)行效果圖如圖4.3所示。 泡泡腐蝕顯示 泡泡腐蝕在設(shè)計(jì)的時(shí)候是由馬賽克顯示聯(lián)想到下雨的時(shí)候地面被打濕的現(xiàn)象,這也有些類(lèi)似于馬賽克顯示,但是又在隨機(jī)顯示的同時(shí)參加了有規(guī)律性跟雨滴大小的不定性。整個(gè)顯示分成兩局部:第一局部由每一步定量的產(chǎn)生一定面積大小的泡泡,并隨機(jī)顯示在圖像顯示區(qū),顯示區(qū)域的圖片塊取得的是待顯示圖片的相應(yīng)位置圖片塊,泡泡數(shù)目一直增加直至圖像顯示完全;第二局部對(duì)已經(jīng)顯示出來(lái)的泡泡進(jìn)行擴(kuò)大顯示,直至整圖顯示完全,其擴(kuò)大的速度在本設(shè)計(jì)中是通過(guò)控制泡泡半徑的增加度與其面積成反比的運(yùn)算。算法實(shí)現(xiàn)根本思路:由于對(duì)

47、隨機(jī)產(chǎn)生的泡泡還需要使其產(chǎn)生擴(kuò)大的效果,不能通過(guò)簡(jiǎn)單的計(jì)算得到,也不能使用數(shù)組記錄下來(lái),所以在設(shè)計(jì)中引入了隊(duì)列進(jìn)行保存各泡泡中心點(diǎn)坐標(biāo)以及泡泡半徑和擴(kuò)大速度擴(kuò)大的速度都是變慢的,所以設(shè)計(jì)中以另一個(gè)速度因子speed表示,把每個(gè)泡泡運(yùn)算一遍看是否擴(kuò)大做為整個(gè)程序運(yùn)行的一步,那么一個(gè)泡泡需要經(jīng)過(guò)一步便擴(kuò)大一次半徑或都要經(jīng)過(guò)N步才擴(kuò)大一次半徑,這個(gè)N便是速度因子。為了使由于隊(duì)列運(yùn)算量大而導(dǎo)致運(yùn)行時(shí)間過(guò)長(zhǎng)的時(shí)間縮短,程序使用的隊(duì)列是自主開(kāi)發(fā)的,設(shè)計(jì)了一個(gè)隊(duì)列類(lèi)class LinkQueue,隊(duì)列采用先進(jìn)先出模式處理數(shù)據(jù)。算法在隨機(jī)入隊(duì)add_poin個(gè)點(diǎn)后開(kāi)始對(duì)隊(duì)列中的點(diǎn)計(jì)算并顯示應(yīng)該顯示的區(qū)域后變化

48、速度因子再放入隊(duì)列尾,運(yùn)算完一遍這add_poin個(gè)點(diǎn)后再隨機(jī)的放入add_poin個(gè)點(diǎn),再對(duì)隊(duì)列中的2*add_poin個(gè)點(diǎn)運(yùn)算如此循環(huán),并使用一個(gè)BOOL的數(shù)組記錄圖片每一個(gè)像素點(diǎn)是否顯示過(guò),循環(huán)當(dāng)所有點(diǎn)都顯示而退出。泡泡腐蝕顯示流程如圖4.4所示。 泡泡腐蝕算法關(guān)鍵代碼如下: LinkQueue q;/初始化一個(gè)空隊(duì)列QElem poin; /進(jìn)出隊(duì)列及運(yùn)算顯示的點(diǎn),QElem用于保存泡泡點(diǎn)信息的數(shù)據(jù) const add_poin=15;/每一步新參加隊(duì)列的泡泡點(diǎn)數(shù)const add_wid=2;/泡泡擴(kuò)大時(shí)擴(kuò)大的半徑像素?cái)?shù)srand(unsigned)time(NULL);/產(chǎn)生隨機(jī)數(shù)

49、的種子BOOL * record = (BOOL *)malloc(bs.bmWidth*bs.bmHeight*sizeof(BOOL); /記錄數(shù)組,記錄圖像所有像素點(diǎn)是否顯示for(int i=0;i=bs.bmWidth*bs.bmHeight;i+)recordi=0; /初始化記錄數(shù)組int num_show=0;/記錄已經(jīng)顯示出來(lái)的點(diǎn)個(gè)數(shù) int length_Queue=0;/記錄某一步隊(duì)列中泡泡個(gè)數(shù)開(kāi)始初始化數(shù)組、變量隊(duì)列等空隊(duì)列?&所有像素點(diǎn)顯示隊(duì)列中所有泡泡運(yùn)算完一遍?新參加add_poin個(gè)泡泡信息數(shù)據(jù)出隊(duì)一個(gè)泡泡信息數(shù)據(jù)分析speed,對(duì)此泡泡擴(kuò)大顯示?改變speed

50、并入隊(duì)取以泡泡圓心為中點(diǎn)2*are_wid為寬度的正方形內(nèi)第一像素點(diǎn)是否顯示此點(diǎn)?顯示此像素點(diǎn),并標(biāo)示愿取得正方形區(qū)域的下一點(diǎn)修改泡泡信息并入隊(duì)隊(duì)列現(xiàn)有泡泡循環(huán)完?延時(shí)函數(shù)返回調(diào)用該泡泡循環(huán)完YYNNNYYNYN圖4.4 泡泡腐蝕顯示的算法流程圖 do if(length_Queue=q.Getlength()/某步中是否已有泡泡都計(jì)算過(guò)一遍 length_Queue=0;/已計(jì)算過(guò)的泡泡重置為零 for(short addpoin=0;addpoinadd_poin;addpoin+) /在隊(duì)列中新參加多個(gè)泡泡 poin.are_wid=2+rand()%2;/新泡泡隨機(jī)大小 poin.sp

51、eed=1;/新泡泡顯示因子 poin.x=rand()%bs.bmWidth;/ poin.y=rand()%bs.bmHeight;/泡泡中心x,y坐標(biāo) q.Push(poin);/參加隊(duì)列 /for / if q.Pop(poin);/取出一個(gè)泡泡分析 length_Queue+;/某一步中分析的泡泡數(shù)自加 if(poin.speed!=1)/分析泡泡因子,不為1那么減1入隊(duì)等待下次運(yùn)算 poin.speed-;q.Push(poin); continue;/if for(float ix=poin.x-poin.are_wid;ix=poin.x+poin.are_wid;ix+) /

52、for1 for(float iy=poin.y-poin.are_wid;iy=poin.y+poin.are_wid;iy+) / 運(yùn)算分析從隊(duì)列中取出的點(diǎn) /取其為中心邊長(zhǎng)2*are_wid正方形 范圍內(nèi)像素點(diǎn) ix,iy坐標(biāo) int temp_ix_iy=ix+iy*bs.bmWidth; /temp_x_y為一維記錄數(shù)組中(ix,iy)位置 if(ix=bs.bmWidth | iy=bs.bmHeight |recordtemp_ix_iy); /點(diǎn)不在圖像中或已經(jīng)顯示那么跳過(guò) else/else1 if(ix-poin.x)*(ix-poin.x)+(iy-poin.y)*(iy

53、-poin.y)StretchBlt(IncX+ix,IncY+iy,1,1, &dc,ix,iy,1,1,SRCCOPY );/顯示此像素點(diǎn) recordtemp_ix_iy=true;/標(biāo)示此點(diǎn)已顯示 num_show+;/記錄顯示過(guò)的點(diǎn)數(shù) /if/else1/for/for1poin.are_wid+=add_wid; /對(duì)一個(gè)泡泡擴(kuò)大顯示后計(jì)算其下次顯示時(shí)應(yīng)該擴(kuò)大的范圍 poin.speed+=(poin.are_wid3)?1:poin.are_wid*poin.are_wid/3; /速度因子改變, q.Push(poin); /置入隊(duì)列等待下一步的運(yùn)算if(length_Queu

54、e=q.Getlength()Sleep(40); /分析完一步中所以泡泡,時(shí)間延遲while(q.Getlength() & num_showEShow_1(bs,dc,0,0);break;特效顯示函數(shù) . default:break; MessageBox(Done!);/提示 ReleaseDC(pDC);/釋放DC 根本窗口設(shè)計(jì) 本次設(shè)計(jì)采用MFC的對(duì)話(huà)框窗口作為主窗口,以用于顯示加載的位圖及圖像的特效顯示平臺(tái)。加載位圖時(shí),使用通用對(duì)話(huà)框中的文件翻開(kāi)對(duì)話(huà)框取得在磁盤(pán)上的所需位圖名CString fileName。顯示及特效顯示時(shí),調(diào)用自定義的對(duì)話(huà)框成員函數(shù)加載位圖,然后在設(shè)備上顯示出

55、來(lái)。特效顯示功能是菜單項(xiàng)進(jìn)行控制的,在的設(shè)計(jì)中各特效顯示特效是由主窗口的成員函數(shù)調(diào)用的,所以在菜單項(xiàng)的消息處理函數(shù)中只需調(diào)用該成員函數(shù)并傳入正確的參數(shù),就可以實(shí)現(xiàn)特效顯示。設(shè)計(jì)中相關(guān)代碼有:1.翻開(kāi)位圖文件代碼: CString m_fileName;/用于保存位圖的路徑 文件名 wchar_t *filters = L位圖文件(*.bmp)|所有文件(*.*)|*.*|; CFileDialog *fileDlg; fileDlg=new CFileDialog(TRUE,bmp,*.bmp,OFN_HIDEREADONLY, 位圖文件(*.bmp)|所有文件(*.*)|*.*|);此代碼實(shí)

56、現(xiàn)的功能為使用通用對(duì)話(huà)框中的翻開(kāi)對(duì)話(huà)框用戶(hù)可以選擇需要翻開(kāi)的bmp文件,返回的文件路徑及文件名保存在m_fileName中。 2.在資源里新建菜單設(shè)計(jì)好之后使用以下代碼將其參加到主窗口中: CMenu m_menu;/定義菜單m_menu.LoadMenu(IDR_MENU1);/加載菜單 SetMenu(&m_menu);/顯示菜單到當(dāng)前窗口此局部代碼將菜單加載并顯示出來(lái),因?yàn)橐诖翱陲@示的時(shí)候同時(shí)顯示出菜單,所以在對(duì)話(huà)框:OnInitDialog()方法中參加以到達(dá)效果。:圖4.6 Windows的界面設(shè)計(jì)效果截圖4.3 測(cè)試分析及總結(jié) 兩個(gè)特效顯示的最終效果根本上按預(yù)定的設(shè)計(jì)完成,兩個(gè)特

57、效都具有實(shí)用性跟美觀性。漸變百葉窗特效的算法相對(duì)簡(jiǎn)單,運(yùn)行時(shí)能顯示出比擬好的效果;泡泡腐蝕特效的算法比擬復(fù)雜,運(yùn)行時(shí)使人感到眼花繚亂,整體效果也是不錯(cuò)的。在設(shè)計(jì)中遇到了不少問(wèn)題,其中有的問(wèn)題已經(jīng)解決,對(duì)這些問(wèn)題分點(diǎn)闡述如下: 1.算法靈活性。假設(shè)泡泡腐蝕特效中的泡泡每一步的增加個(gè)數(shù)不同,顯示出來(lái)的效果也會(huì)有所不同,在算法實(shí)現(xiàn)函數(shù)中將一些與算法密切相關(guān)的數(shù)值(如泡泡腐蝕泡泡每步增加的個(gè)數(shù)、第一次顯示時(shí)大小及時(shí)間延遲長(zhǎng)度等)定義為傳遞參數(shù),可以通過(guò)傳遞不同的參數(shù),靈活的調(diào)用該函數(shù),實(shí)現(xiàn)不同的顯示效果。通過(guò)對(duì)這些參數(shù)測(cè)試取得比擬優(yōu)秀的組合,使運(yùn)行時(shí)能較好的展示相應(yīng)的顯示效果,在函數(shù)聲明時(shí)將該組合作為函數(shù)的缺省值,函數(shù)調(diào)用時(shí)便能以簡(jiǎn)潔的方式獲得較好的效果。 2.圖像顯示位置。當(dāng)圖像過(guò)小,小于窗口的大小時(shí),顯示出來(lái)的圖像顯得很小,界面不美觀。更改窗口的大小以適應(yīng)圖像的大小將是不錯(cuò)的想法,但菜單欄占據(jù)窗口的一定寬度使窗口不能隨意改變,設(shè)計(jì)時(shí)采用的方法是初始化窗口大小為一個(gè)比擬適中的窗口大小600*450,采用垂直居中、水平居中顯示圖像。3.裝載的圖像過(guò)大。當(dāng)特效顯示應(yīng)用于分辨率過(guò)大的圖像時(shí),窗口過(guò)大使得顯示的

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論