本身和MFC无关,只是将image2中白色(如255,255,255)得像素用image1中的像素替换。

解决方案 »

  1.   

    去看看VC知识库在线杂志49期《多层图像合成修正版》一文。
    把部分代码贴出来:
     CBitmap* poldBk=m_dcBk.SelectObject(&m_bmpBk); //选入背景图
       CBitmap* poldFore=m_dcFore.SelectObject(&m_bmpFore);   CRect rect;
       GetClientRect(&rect); //得到客户区矩形
       CDC maskDc; //创建设备环境maskDc
       CBitmap maskBitmap;
       maskDc.CreateCompatibleDC(pDC); //创建与当前设备相兼容的设备
       maskBitmap.CreateBitmap(rect.Width(),rect.Height(),1,1,NULL ); //创建一个单色图
       CBitmap* pOldMaskDCBitmap = maskDc.SelectObject( &maskBitmap ); //选入单色图
       CBrush brush(RGB(255,255,255));
       CBrush * oldbrush;
       oldbrush=maskDc.SelectObject(&brush);
       maskDc.FillRect(&rect,&brush);
       //取得要消除的背景色值
       COLORREF clrTrans= m_dcFore.GetPixel(2, 2);   // 设置前景图的背景色
       COLORREF clrSaveBk = m_dcFore.SetBkColor(clrTrans);   //将前景图拷贝到maskDc
        maskDc.BitBlt(0,0,rect.Width(),rect.Height(), &m_dcFore, 0,0,SRCCOPY);     //将前景图拷贝到maskDc,此时maskDc如下图:                             //前景图与mask做‘与’运算 
        m_dcFore.SetBkColor(RGB(0,0,0));
        m_dcFore.SetTextColor(RGB(255,255,255));
        m_dcFore.BitBlt(0,0,rect.Width(), rect.Height(),&maskDc,0,0,SRCAND);
      

  2.   

    pDC->TransparentBlt(lImageX, lImageY, lImageWidth, lImageHeight, &m_dcImage, 0, 0, wScreenWidth, wScreenHeight, RGB(0xFF,0xFF,0xFF));
      

  3.   


    标准GDI的TransparentBlt,最后一个参数设置为白色就可以了。不过在头文件里面要 #pragma comment( lib,"msimg32.lib")
      

  4.   

    原理:
    创建一个与image1或image2相兼容的内存DC
    然后将image1绘制上去
    再使用TransparentBlt函数(最后的颜色参数使用RGB(255,255,255))这样就可以去掉image2的白色部分绘制在内存DC中 就形成了image2除去白色后叠加在image1上的效果了.
      

  5.   

    buggycode(风雨寒夜) ( ) 信誉:100    Blog   加为好友  2007-6-16 14:30:37  得分: 0  本身和MFC无关,只是将image2中白色(如255,255,255)得像素用image1中的像素替换