镂空图的制作技巧
镂空图就是将图片中的一部分显示在另一张背景图上,而且除去图中中不需要显示的部分(这些部分必须是白色或黑色),下图就是镂空图的显示效果。
下图则是镂空图的图像:
要产生镂空图,只须使用前面所介绍的BitBlt函数与Raster运算。本节将讲解镂空图的原理,并制作镂空图范例。
产生镂空图的步骤
制作镂空图有许多种方法,不过都是利用不同的Raster运算进行转换,而产生相同的镂空效果。在这里,我们将介绍最简单且最容易记住的一种方式。
上图中的位图可以分为两半部(两个人物合在一幅位图里),左半边为人物,要镂空的部分为黑色;右半部分只有黑色和白色图,我们称之为蒙版;。下面我们来介绍产生镂空图的步骤:
步骤一:使用BitBlt函数将蒙版与背景图做AND运算,贴到目的地DC中。
步骤二:再以要镂空的图与背景图做OR运算,贴到目的地DC中。
制作镂空图的原理
为什么经过上面的两个步骤就能产生镂空的效果了呢?
Ø 在步骤一中,将蒙版与背景图做AND运算。
1. 蒙版的中间人物为黑色,与背景图做AND运算变成:
2.蒙版四周为白色,与背景图做AND运算变成:
步骤一产生的结果如下图所示:
Ø 在步骤二中,再将要镂空的图与背景图做OR运算:
1.图片中的人物为彩色,与上一张图做OR运算变成:
2.人物四周为黑色,与背景图做OR运算变成:
这样,产生的结果就是我们所要的镂空图了:
最后,再来看一个镂空图范例:
(1) 生成一个对话框程序,工程名为ch2_5
(2) 在ch2_5Dlg.h中增加几个public成员:
public:
CDC *mdc;
CBitmap *bgbmp,*bitmap;
RECT rect;
在BOOL CCh2_5Dlg::OnInitDialog()函数中加载两张位图,其程序源代码如下:
CClientDC dc(this);
GetClientRect(&rect);
mdc=new CDC;
bgbmp=new CBitmap;
bitmap=new CBitmap;
mdc->CreateCompatibleDC(&dc);
bgbmp->m_hObject=LoadImage(NULL,"res/mslinux.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
bitmap->m_hObject=LoadImage(NULL,"res/zzz.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
在void CCh2_5Dlg::OnPaint()函数中贴上背景图,并将蒙版图与背景图做AND运算,再将要镂空与背景图做OR运算,这样就产生镂空效果。
CClientDC dc(this);
mdc->SelectObject(bgbmp);
//贴上背景图
dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
mdc->SelectObject(bitmap);
//将蒙版与背景图做AND运算
dc.BitBlt(180,90,97,125,mdc,104,0,SRCAND);
//将要镂空的图与背景图做OR运算
dc.BitBlt(180,90,97,125,mdc,0,0,SRCPAINT);
在程序开始加载的时候,我们发现如果将镂空的图案与蒙版结合为一张位图,可以利用BitBlt函数来动态的选择要贴到窗口中的图案,这样便可以提升计算机运行的效率。而且一次加载所有需要的图形,可以减少硬盘数据的I/O动作,因为从内存中选择要贴到屏幕上的图形的速度,远比从硬盘中加载图形快,这一点在设计程序时可得紧记在心啊。