用Visual C++實現圖象漸顯和漸隱_第1頁
用Visual C++實現圖象漸顯和漸隱_第2頁
用Visual C++實現圖象漸顯和漸隱_第3頁
用Visual C++實現圖象漸顯和漸隱_第4頁
用Visual C++實現圖象漸顯和漸隱_第5頁
已閱讀5頁,還剩8頁未讀 繼續免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、用Visual C+實現圖象漸顯和漸隱 圖象的漸顯/漸隱是十分重要的圖象效果,廣泛運用于圖象處理和多媒提娛樂軟件。漸顯/漸隱算法設計的最大困難是速度控制,包括定時和快速改變圖象中各象素的顏色。如采用普通的全圖掃描算法,則速度較慢,很難真正體現漸顯/漸隱效果。利用Windows(3.x.95/98/NT)操作系統特殊的調色板管理和時間碼定時機制能設計出有效的圖象漸顯/漸隱算法。Windows提供一種被稱為調色板動畫(palette animation)的顏色處理技術,它通過快速改變顏色調色板中所選取的表項中的顏色能模擬顏色的變化。設置時間碼,定時調用該技術使圖象顏色漸變就能實現圖象的漸顯和漸隱。

2、一、調色板動畫在Visual C+中實現調色板動畫依賴于MFC類庫提供的CPalette類和CDC類中的若干成員函數,其基本步驟如下:調用CPalette:CreatePalette(LPLOGPALETTE lpLogPalette)函數創建邏輯調色板,注意將參數LPLOGPALETTE所指向的各顏色表項結構的peFlags域設置為PC_RESERVED,以防止其它窗口同該調色板匹配顏色。;調用CDC:SelectPalette和CDC:RealizePalette函數選擇和實現所創建的邏輯調色板;調用CPalette:AnimatePalette函數改變顏色,實現調色板動畫;動畫完成后應恢

3、復系統調色板。CPalette:AnimatePalette是其中最關鍵的函數,其原型如下:void AnimatePalette(UINT nStartIndex, / 起始的表項號UINT nNumEntries, / 變化的表項數LPPALETTEENTRY lpPaletteColors ); / 邏輯調色板表項指針lpPaletteColors為指向PALETTEENTRY結構的指針,其中存儲著邏輯調色板將要更新的顏色信息。PALETTEENTRY結構定義如下:typedef struct tagPALETTEENTRY / peBYTE peRed;BYTE peGreen;BYT

4、E peBlue;BYTE peFlags; PALETTEENTRY;peRed、peGreen、peBlue分別表示邏輯調色板項的R、G、B顏色分量值。peFlags 應被置為PC_RESERVED 。nStartIndex為lpPaletteColors中將變化的起始表項號,nNumEntries 為lpPaletteColors中將變化的表項數。二、時間碼定時CWnd:SetTimer函數可設置一個系統時間碼,并指定每經過一定的時間間隔使Windows系統發送一個WM_TIMER消息到窗口的消息隊列中。窗口在每當接收到相應的WM_TIMER消息時做一定的處理,便實現了定時處理。通常應在

5、窗口的消息循環中接受和處理WM_TIMER消息,這樣將很難編制通用的定時操作。通用的定時操作應將定時處理封裝在一個函數中,而不與其它的代碼糾纏在一起。筆者實現這一技術的技巧是,在循環操作中截獲窗口消息,如消息為指定的時間碼消息,則進行定時處理;否則分發消息給窗口消息處理機制。如果定時操作已結束,則修改循環標志,退出循環。具體的代碼如下:/ 設置時間碼,pWnd為處理定時操作的窗口對象指針pWnd-SetTimer(0x100, uTimeOut, NULL);/ 屏蔽鼠標操作,使定時操作不受影響pWnd-SetCapture();/ 開始定時操作BOOL bDone = FALSE;MSG m

6、sg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg. WParam = 0x100).定時操作代碼./ 如定時操作完成,則設置循環標志,結束操作if (定時操作完成)bDone = TRUE;:TranslateMessage(&msg);:DispatchMessage(&msg);/ 釋放鼠標:ReleaseCapture();/ 刪除時間碼pWnd-KillTimer(0x100);.函數PeekMessage截獲窗口消息,TranslateMess

7、age和DispatchMessage函數解釋和分發除指定時間碼消息之外的所有消息,以避免丟失消息。三、漸顯漸顯就是將顯示顏色由黑色(RGB(0, 0, 0))逐漸變化為圖象各象素的顏色的過程。開始時調用CPalette:GetPaletteEntries函數保存圖象調色板的各邏輯表項信息,然后調用CPalette:SetPaletteEntries函數將邏輯調色板中各邏輯表項的peRed、peGreen、peBlue置為0,定時調用CPalette:AnimatePalette,每次將各邏輯表項的peRed、peGreen、peBlue值增加一個變化量,直到它們分別等于圖象邏輯調色板中各邏輯

8、表項的peRed、peGreen、peBlue值。下面的函數FadeIn通過對調色板顏色表項中的各顏色分量值先設為0,然后進行遞增,直到所有顏色值都恢復成原調色板中顏色值來實現漸顯。/ 圖象漸顯效果/ 參數:/ pWnd - 顯示圖象的窗口/ pPal - 調色板指針/ nDeta - 各顏色分量的減小量/ uTimeOut - 時間的變化量void FadeIn(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)/ 保留原來的調色板顏色表項int nTotalColors = pPal-GetEntryCount();PALETTEEN

9、TRY PaletteColors0256;pPal-GetPaletteEntries(0, nTotalColors, PaletteColors0);/ 先將調色板表項中各顏色分量置為0PALETTEENTRY PaletteColors1256;for (int i=0; iSetPaletteEntries(0, nTotalColors, PaletteColors1);pPal-AnimatePalette(0, nTotalColors, PaletteColors1);/ 設置時間碼pWnd-SetTimer(0x100, uTimeOut, NULL);/ 開始漸顯pWnd

10、-SetCapture();BOOL bDone = FALSE;MSG msg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg.wParam = 0x100)CClientDC dc(pWnd);CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);dc.RealizePalette();/ 遞增各顏色分量PALETTEENTRY PaletteColors256;pPal-GetPaletteEntries(

11、0, nTotalColors, PaletteColors);BOOL bRedZero=FALSE;BOOL bGreenZero=FALSE;BOOL bBlueZero=FALSE;for (int i=0; inTotalColors; +i)if (PaletteColorsi.peRed + nDeta PaletteColors0i.peRed)PaletteColorsi.peRed += nDeta;bRedZero = FALSE;else if (PaletteColorsi.peRed + 1 PaletteColors0i.peRed)PaletteColorsi.

12、peRed+;bRedZero = FALSE;elsebRedZero = TRUE;if (PaletteColorsi.peGreen + nDeta PaletteColors0i.peGreen)PaletteColorsi.peGreen += nDeta;bGreenZero = FALSE;else if (PaletteColorsi.peGreen + 1 PaletteColors0i.peGreen)PaletteColorsi.peGreen+;bGreenZero = FALSE;elsebGreenZero = TRUE;if (PaletteColorsi.pe

13、Blue + nDeta PaletteColors0i.peBlue)PaletteColorsi.peBlue += nDeta;bBlueZero = FALSE;else if (PaletteColorsi.peBlue +1 AnimatePalette(0, nTotalColors, PaletteColors);:TranslateMessage(&msg);:DispatchMessage(&msg);:ReleaseCapture();pWnd-KillTimer(0x100);/ 恢復原始調色板pPal-SetPaletteEntries(0, nTotalColors

14、, PaletteColors0);pPal-AnimatePalette(0, nTotalColors, PaletteColors0);四、漸隱漸隱就是將顯示顏色由圖象各象素的顏色逐漸變化為黑色(RGB(0, 0, 0))的過程,即定時調用CPalette:AnimatePalette,每次將各邏輯表項的peRed、peGreen、peBlue值減小一個變化量,直到它們都為0。下面的函數FadeOut通過對調色板顏色表項中的各顏色分量值進行遞減,直到所有顏色值都變成0(即黑色)來實現漸隱。/ 圖象漸隱效果/ 參數:/ pWnd - 顯示圖象的窗口/ pPal - 調色板指針/ nDeta

15、 - 各顏色分量的減小量/ uTimeOut - 時間的變化量void FadeOut(CWnd *pWnd, CPalette *pPal, int nDeta, UINT uTimeOut)/ 保留原來的調色板顏色表項int nTotalColors = pPal-GetEntryCount();PALETTEENTRY PaletteColors0256;pPal-GetPaletteEntries(0, nTotalColors, PaletteColors0);/ 設置時間碼pWnd-SetTimer(0x100, uTimeOut, NULL);/ 開始漸隱pWnd-SetCapt

16、ure();BOOL bDone = FALSE;MSG msg;while (! bDone)if (:PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)if (msg.message = WM_TIMER & msg.wParam = 0x100)CClientDC dc(pWnd);CPalette *pOldPal = dc.SelectPalette(pPal, FALSE);dc.RealizePalette();PALETTEENTRY PaletteColors256;pPal-GetPaletteEntries(0, nTotalColors,

17、PaletteColors);BOOL bRedZero=FALSE;BOOL bGreenZero=FALSE;BOOL bBlueZero=FALSE;/ 遞減顏色分量for (int i=0; i nDeta)PaletteColorsi.peRed -= nDeta;bRedZero = FALSE;else if (PaletteColorsi.peRed 1)PaletteColorsi.peRed-;bRedZero = FALSE;elsebRedZero = TRUE;if (PaletteColorsi.peGreen nDeta)PaletteColorsi.peGree

18、n -= nDeta;bGreenZero = FALSE;else if (PaletteColorsi.peGreen 1)PaletteColorsi.peGreen-;bGreenZero = FALSE;elsebGreenZero = TRUE;if (PaletteColorsi.peBlue nDeta)PaletteColorsi.peBlue -= nDeta;bBlueZero = FALSE;else if (PaletteColorsi.peBlue 1)PaletteColorsi.peBlue-;bBlueZero = FALSE;elsebBlueZero = TRUE;/ 如所有顏色分量都為0,則結束漸隱bDone = bRedZero & bGre

溫馨提示

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

評論

0/150

提交評論