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里面,然后再输出到屏幕上,就可以实现图片的镂空效果。
    原图:要镂空的图片

    windows api实现图片的镂空效果_第1张图片

游戏背景的图
windows api实现图片的镂空效果_第2张图片

还需要一张蒙版图
windows api实现图片的镂空效果_第3张图片

目的:将游戏的白色背景改成游戏背景图
原理:
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);

结果图
windows api实现图片的镂空效果_第4张图片

你可能感兴趣的:(位运算,windows,函数,api,图片)