读书人

图像编程-怎么实现一个透空图片

发布时间: 2012-10-10 13:58:11 作者: rapoo

图像编程----如何实现一个透空图片

?? 在mfc中,我们经常碰到的一个情况是,想在界面上添加一个图片,比方说一个小人,但是我们不想要除了图片中小人外的其它图片,怎么办?

?? 我们需要准备三个素材,第一个背景图片,第二个你想要添加的原始小人图片(除小人外其余地方为黑色),第三个屏蔽图片,该图片将你想要扣出来的图片的区域全部涂成黑色,其余部位为白色。


????????????????? 图像编程-怎么实现一个透空图片???????????????????????? 图像编程-怎么实现一个透空图片
?
????????????????????????? 原始要加载的图片?????????????????????????????????????????? 屏蔽图,需要的为黑,不需要的为白

???

?



?
图像编程-怎么实现一个透空图片
?????????????????????????????????????????????????????????????????

??????????????????????????????????????????????????????????????????????????? ???背景图

?那么只要下面两个步骤就可以了:

步骤一: 使用bitblt函数将屏蔽图与背景图做AND运算,贴到目的地DC中

步骤二: 再以要透空的图与背景图做OR运算,贴到目的地DC中

void CMyDlg::OnPaint() {CPaintDC dc(this);CDC *mdc = new CDC; //建立一个暂存DCCBitmap *bitmap1 = new CBitmap; //建立源位图    CBitmap *bitmap2 = new CBitmap; //用于反色的源图CBitmap *bgbmp = new CBitmap;//背景图片    CRect rect;GetClientRect(&rect);mdc->CreateCompatibleDC(&dc);if(NULL == (bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE)))AfxMessageBox("加载背景图片出错");    if(NULL == (bitmap1->m_hObject = (HBITMAP)::LoadImage(NULL,"2.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE)))AfxMessageBox("加载源图图片出错");    if(NULL == (bitmap2->m_hObject = (HBITMAP)::LoadImage(NULL,"3.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE)))AfxMessageBox("加载源图反色图片出错");mdc->SelectObject(bgbmp);//取得背景图dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);mdc->SelectObject(bitmap2);dc.BitBlt(0,0,rect.right/2+70,rect.bottom/2+30,mdc,40,40,SRCAND);mdc->SelectObject(bitmap1);dc.BitBlt(0,0,rect.right/2+70,rect.bottom/2+30,mdc,40,40,SRCPAINT);}

?效果图如下:


????????????????????????? 图像编程-怎么实现一个透空图片
?

读书人网 >编程

热点推荐