图像编程----如何实现一个透空图片
?? 在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);}?效果图如下:
????????????????????????? 
?