windows api實現圖片的鏤空效果

windows api實現圖片的鏤空效果

時間緊迫:簡單說一下:
其實鏤空我學到的有三種代碼方法:

  1. directdraw用顏色鍵碼實現(簡單,這個不介紹)
  2. Windows api Bitblt函數實現
  3. 第三種方法可以用easyx庫中的函數。方法不解釋了(easyx過時的東西,玩玩可以)

    2方法的具體實現
    這個的原理:利用圖片的位運算實現,因爲圖片的顏色使用RGB三原色表示,黑色的RGB全爲0 ,白色的RGB全爲1。圖片在內存的存儲就是存儲的這些值(單片機老師講過)。根據位運算,和黑色0與(and)全爲0 ,和白色1與(and)顏色不變。等根據這樣的原理,只要將我們的圖片和背景圖片進行位運算放在一個內存dc裏面,然後再輸出到屏幕上,就可以實現圖片的鏤空效果。
    原圖:要鏤空的圖片

    這裏寫圖片描述

遊戲背景的圖
這裏寫圖片描述

還需要一張蒙版圖
這裏寫圖片描述

目的:將遊戲的白色背景改成遊戲背景圖
原理:
1:先將蒙版圖和背景圖先或運算,得到目的dc:2:在將目的的dc的圖片和原圖進行與運算。
3:將內存dc上的圖片複製到設備dc,即屏幕。
完整代碼
win32在paint事件中添加

 HDC hdc ;
//得到設備dc,hwnd是窗口句柄
   hdc = GetDC(hwnd);
//定義內存dc
   HDC hdcSrc = CreateCompatibleDC(hdc);
   HDC hdcBack = CreateCompatibleDC(hdc);
   HDC hdcMem = CreateCompatibleDC(hdc);
 //加載圖片,需要是.bmp圖片,也可以是資源                 
   HBITMAP HBitmapSrc = (HBITMAP)::LoadImage(NULL,   "flappy_packer.bmp", IMAGE_BITMAP, 600, 600,  LR_LOADFROMFILE);
   HBITMAP HBitmapBack = (HBITMAP)::LoadImage(NULL , "bg.bmp" , IMAGE_BITMAP , 600 , 600 , LR_LOADFROMFILE);
   HBITMAP hBitmapMem = (HBITMAP)::LoadImage(NULL , "flappy_packer2.bmp" , IMAGE_BITMAP , 600 , 600 , LR_LOADFROMFILE);
//將位圖選入內存dc
    SelectObject(hdcSrc , HBitmapSrc);
   SelectObject(hdcBack , HBitmapBack);
   SelectObject(hdcMem , hBitmapMem);
   //BitBlt(hdcMem , 0 ,0 , 600 , 600 , hdcBack , 0 , 0 ,SRCCOPY);
   //BitBlt(hdc , 0 , 0 , 600 , 600 , hdcMem  , 0 , 0 , SRCCOPY);
//先將背景圖和蒙版圖進行或運算,得到新的hdcMem
    BitBlt(hdcMem , 0 , 0 , 600 , 600 , hdcBack , 0, 0 , SRCPAINT);
//在將原圖和hdcMem進行與運算,的到新的hdcMem
    BitBlt(hdcMem , 0 , 0 , 600 , 600 , hdcSrc , 0 , 0 , SRCAND);
//將hdcMem的內容貼到屏幕上,即窗口
    BitBlt(hdc , 0 ,0 , 600, 600 , hdcMem , 0 , 0 , SRCCOPY);

結果圖
這裏寫圖片描述

發佈了26 篇原創文章 · 獲贊 80 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章