Alpha Blend code (MFC)

来源:互联网 发布:美国步枪协会 知乎 编辑:程序博客网 时间:2024/05/21 17:54

 void CMyDlg::AlphaBlend(CDC *pDC, double blend)
{
    BITMAP bmpX,bmpY;
    
    CBitmap bmp1,bmp2;
    bmp2.LoadBitmap(IDB_BITMAP2);
    bmp1.LoadBitmap(IDB_BITMAP1);

    bmp1.GetBitmap(&bmpX);
    UINT* bmpBuffer=(UINT*) GlobalAlloc(GPTR,
                            bmpX.bmWidthBytes * bmpX.bmHeight);
    bmp1.GetBitmapBits(bmpX.bmWidthBytes * bmpX.bmHeight, bmpBuffer);

    bmp2.GetBitmap(&bmpY);
    UINT* bmpBuffer2=(UINT*) GlobalAlloc(GPTR,
                             bmpY.bmWidthBytes * bmpY.bmHeight);
    bmp2.GetBitmapBits(bmpY.bmWidthBytes * bmpY.bmHeight, bmpBuffer2);

    int nSize = bmpY.bmWidth * bmpY.bmHeight;

    for (int i = 0; i < nSize; i++)
    {
        int abR = (int) (GetR(bmpBuffer[i]) * blend +
                        (1-blend) * GetR(bmpBuffer2[i]));
        int abG = (int) (GetG(bmpBuffer[i]) * blend +
                        (1-blend) * GetG(bmpBuffer2[i]));
        int abB = (int) (GetB(bmpBuffer[i]) * blend +
                        (1-blend) * GetB(bmpBuffer2[i]));

        bmpBuffer2[i] = RGB(abB, abG, abR);
    }

    bmp2.SetBitmapBits(bmpX.bmWidthBytes * bmpX.bmHeight, bmpBuffer2);

    CDC memdc;
    memdc.CreateCompatibleDC(pDC);
    memdc.SelectObject(bmp2);
    pDC->BitBlt(10,10,bmpX.bmWidthBytes,
                bmpX.bmHeight, &memdc, 0, 0, SRCCOPY);

    GlobalFree((HGLOBAL)bmpBuffer);
    GlobalFree((HGLOBAL)bmpBuffer2);
    memdc.DeleteDC();
}