图像编程-怎么实现一个透空图片
图像编程----如何实现一个透空图片
在mfc中,我们经常碰到的一个情况是,想在界面上添加一个图片,比方说一个小人,但是我们不想要除了图片中小人外的其它图片,怎么办?
我们需要准备三个素材,第一个背景图片,第二个你想要添加的原始小人图片(除小人外其余地方为黑色),第三个屏蔽图片,该图片将你想要扣出来的图片的区域全部涂成黑色,其余部位为白色。
原始要加载的图片 屏蔽图,需要的为黑,不需要的为白
背景图
那么只要下面两个步骤就可以了:
步骤一: 使用bitblt函数将屏蔽图与背景图做AND运算,贴到目的地DC中
步骤二: 再以要透空的图与背景图做OR运算,贴到目的地DC中
void CMyDlg::OnPaint() { CPaintDC dc(this); CDC *mdc = new CDC; //建立一个暂存DC CBitmap *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); }
效果图如下: