資源描述:
《VC數(shù)字圖像處理編程講座之四》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、VC數(shù)字圖像處理編程講座之四[導(dǎo)讀]在這一講中作者進(jìn)一步深入講解了圖像特效的顯示技術(shù)......BMP圖像顯示的特效操作 上期講座中我們主要講述了BMP圖像數(shù)據(jù)的存取、圖像的顯示和調(diào)色板的操作等內(nèi)容,在上面的學(xué)習(xí)基礎(chǔ)上,我們可以進(jìn)一步深化,學(xué)習(xí)并掌握?qǐng)D像特效顯示技術(shù)。有了這種技術(shù),可以用來在今后的項(xiàng)目開發(fā)中美化我們的軟件界面,提高軟件的視覺效果。在如今的商業(yè)軟件中,幾乎每一幅圖像的顯示都采用了圖像特效顯示,例如讀者比較熟悉的Windows的屏幕保護(hù)程序就采用了各種各樣的圖像特效顯示,使人感到眼花繚亂和耳目一新。專業(yè)圖像處理軟件更是提供了豐富的顯示方
2、式供用戶使用,可以方便的在程序中實(shí)現(xiàn)圖像的特效顯示,如PhotoShop、Authorware等。本節(jié)主要介紹如何實(shí)現(xiàn)圖像的浮雕、雕刻、百頁窗、旋轉(zhuǎn)、掃描、柵條、馬賽克、和漸顯漸隱顯示等效果。通過這期講座的學(xué)習(xí),讀者朋友們也可以自己動(dòng)手制作擁有特效顯示效果的軟件了。圖像的顯示我們講過主要有BitBlt()、SetDIBitsToDevice()和StretchDIBits()等函數(shù)。需要讀者注意的是,在特效顯示時(shí),并不是每個(gè)顯示函數(shù)都適宜,BitBlt()函數(shù)主要是用來顯示設(shè)備無關(guān)位圖(DDB),后兩個(gè)函數(shù)用來顯示設(shè)備無關(guān)位圖(DIB)。由于我們講座
3、里處理的是設(shè)備無關(guān)位圖,所以我們主要關(guān)心的是后兩個(gè)函數(shù)的應(yīng)用,其中SetDIBitsToDevice()使用起來較死板,遠(yuǎn)不如StretchDIBits()用的靈活,并且對(duì)大多數(shù)的特效顯示無能為力,所以為了實(shí)現(xiàn)圖像的特效顯示效果,需要使用StretchDIBits()函數(shù)來顯示圖像,具體什么原因,我想可能是微軟在實(shí)現(xiàn)這些函數(shù)時(shí)使用的方法不同吧。這些函數(shù)如何使用,各個(gè)參數(shù)的含義,可以參考微軟的MSDN。 實(shí)現(xiàn)圖像的特殊效果的顯示的基本思路是要么是操作圖像的像素,要么是對(duì)圖像分塊按一定的方向或次序,分階段的顯示或擦除對(duì)應(yīng)的圖像塊。對(duì)于第二種顯示的思路,
4、其中的要點(diǎn)是:1.劃分圖像塊;2.確定圖像塊的操作次序;3.顯示或清除對(duì)應(yīng)的圖像塊;4.在兩個(gè)連續(xù)顯示的圖像塊之間插入一個(gè)固定的延遲。其中圖像塊的劃分決定了圖像的顯示方式,圖像塊的顯示順序決定了顯示的方向和細(xì)分的依據(jù)。不同的效果決定了不同的分塊方法和顯示次序,我們將在后面的各種特效顯示中介紹如何分塊和決定次序。為了使圖像的顯示過程明顯的表現(xiàn)出來,實(shí)現(xiàn)顯示的特效,就需要在圖像塊的依此顯示中插入固定的延遲。也許讀者朋友會(huì)想到利用sleep()函數(shù)或用Settime()來實(shí)現(xiàn)延遲,由于Windows是個(gè)基于消息的多任務(wù)操作系統(tǒng),這些方法所產(chǎn)生的延遲時(shí)間對(duì)于
5、圖像的顯示來說是不精確的,為了實(shí)現(xiàn)與機(jī)器無關(guān)的更精確的時(shí)間延遲,可以采用timeGetTime()函數(shù)來產(chǎn)生微秒級(jí)的延遲。使用這個(gè)函數(shù)時(shí)為了編譯不產(chǎn)生錯(cuò)誤,要在連接設(shè)置中引入“Winmm.lib”庫,并要包含頭文件“Mmsystem.h”。這里我們首先給出一個(gè)延遲函數(shù),它用來實(shí)現(xiàn)固定時(shí)間的延遲:voidDelayTime(DWORDtime){DWORDBeginTime,EndTime;BeginTime=timeGetTime();//得到當(dāng)前的系統(tǒng)時(shí)間、單位為微秒;do{EndTime=TimeGetTime();//再次得到當(dāng)前的系統(tǒng)時(shí)間;}
6、while((EndTime-BeginTime)