65.9K
CodeProject 正在变化。 阅读更多。
Home

AlphaBlending

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.24/5 (13投票s)

2005年12月12日

viewsIcon

57379

downloadIcon

1118

本文档演示了如何混合两个位图。

AlphaBlending

引言

这段代码片段展示了如何使用线性插值公式来混合两个位图。

背景

使用代码

这里有一个函数,可以在 OnPaint()OnDraw() 中使用。实际上,在示例项目中,我没有准备一个函数,而是直接将代码放在 OnPaint() 方法中。在这个函数中,新的混合位图被放置在一个第二个位图上。如果需要,您可以实现代码并创建一个第三个位图来存放新的位图。

第二个参数,double blend,必须在 [0,1) 范围内。这个数字用于第一个位图,第二个数字是 1-blend 用于第二个位图。

void CAlphaBlendingDlg::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();
}
© . All rights reserved.