镂空图的制作技巧

镂空图的制作技巧

       镂空图就是将图片中的一部分显示在另一张背景图上,而且除去图中中不需要显示的部分(这些部分必须是白色或黑色),下图就是镂空图的显示效果。

 

 

 

下图则是镂空图的图像:

 

       要产生镂空图,只须使用前面所介绍的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动作,因为从内存中选择要贴到屏幕上的图形的速度,远比从硬盘中加载图形快,这一点在设计程序时可得紧记在心啊。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值