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

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

   在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);
}

 效果图如下:


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