合成过程中你总需要选择一幅作为前景另一幅作为背景,因此可以把选作前景的位图先生成一个MASK,即只有黑白两色的位图,将背景与前景进行异或运算后与前景的MASK进行与运算,然后再与前景进行异或运算即可实现一种透明融合的效果。如果前景用F表示,背景用B表示,则背景与前景的异或可表示为F^B,因为MASK为像素值只有0和1的黑白图像,因此用异或后的结果与MASK进行与运算时,F^B与MASK中值为1的像素相与,结果不变,而与值为0的像素相与,则结果为0,之后再和前景进行异或运算,则F^B^F=B,0^F=F,因此实现了透明融合。

解决方案 »

  1.   

    生成MASK,是指把你想显示的部分置为黑,而要透明的部分置为白,对于任一图像,如果想编程实现通用的算法比较难,即图像分割目前好象还没有比较通用的,因此可以用PHOTOSHOP把你想显示的部分用索套或钢笔勾画出来然后把不想显示的部分填充为白色,这样你可编程判断哪些是要显示的部分(即像素值RGB都不等于255的),把这部分置为0,这样就生成了一个MASK。
      

  2.   

    void CDlgInterlace::OnBtnBgnprg() 
    {
    // TODO: Add your control notification handler code here
    CString szTempFileName;
    LPBITMAPINFO lpBitmapInfoScr, lpBitmapInfoDst;
    CDIB m_dibSource, m_dibDest;
    int cx, cy, colorbits;
    CString szEditBox;

    m_ctlEditTarget.GetWindowText(szEditBox);
    m_nTotalCount = m_lstCobCopy.GetItemCount();
    if (m_nTotalCount < 2) 
    {
    CString szTitle, szText;
    szTitle.LoadString(IDS_WARNTITLE1);
    szText.LoadString(IDS_WARNMSG1);
    MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
    return;
    }
    else if (szEditBox == "")
    {
    CString szTitle, szText;
    szTitle.LoadString(IDS_WARNTITLE1);
    szText.LoadString(IDS_WARNMSG2);
    MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
    return;
    }
    for(int iIndex=1; iIndex<=m_nTotalCount; iIndex++)
    {
    szTempFileName = m_lstCobCopy.GetItemText(iIndex-1,0);
    m_dibSource.OpenDIB(szTempFileName);
    lpBitmapInfoScr = m_dibSource.GetBitmapInfo();
    cx = m_dibSource.Width();
    cy = m_dibSource.Height();
    colorbits  = m_dibSource.GetBitCount();
    if (iIndex == 1)
    {
    m_dibDest.Create(cx, cy, colorbits);
    lpBitmapInfoDst = m_dibDest.GetBitmapInfo();
    lpBitmapInfoDst->bmiHeader.biXPelsPerMeter 
    = lpBitmapInfoScr->bmiHeader.biXPelsPerMeter;
    lpBitmapInfoDst->bmiHeader.biYPelsPerMeter 
    = lpBitmapInfoScr->bmiHeader.biYPelsPerMeter;
    } for (int nScanLine = iIndex ; nScanLine < cy; nScanLine += m_nTotalCount)
    {
    CMemFile mem;
    unsigned char *src,*dst;
    ASSERT(nScanLine <= m_dibSource.Height() && nScanLine >= 0);

    src = m_dibSource.GetLinePtr(nScanLine);
    dst = m_dibDest.GetLinePtr(nScanLine);
    UINT bt=m_dibDest.Bytes();
    memcpy(src, dst, bt);

    MEMORYSTATUS ms;
    char szMsg[256];
    ms.dwLength = sizeof(MEMORYSTATUS);
    GlobalMemoryStatus( &ms );
    wsprintf(szMsg, "Left: %ld", ms.dwAvailPhys);
    m_szEditTarget = szMsg;
    m_ctlEditTarget.SetWindowText(m_szEditTarget);
    }
    m_dibSource.DestroyDIB();
    }
    m_dibDest.SaveDIB(m_strSaveFileName, BMP);
    m_dibDest.DestroyDIB();

    CString szTitle, szText;
    szTitle.LoadString(IDS_MSGTITLE1);
    szText.LoadString(IDS_MSGTEXT1);
    MessageBox(szText,szTitle,MB_OK|MB_ICONEXCLAMATION);
    }以上是一种合成位图的方法,但内存处理需改进
      

  3.   

    use photoshop
       easy?