IMFVideoMixerBitmap::SetAlphaBitmap 方法 (evr9.h)

为增强的视频呈现器设置位图图像, (EVR) 以 alpha 与视频混合。

语法

HRESULT SetAlphaBitmap(
  [in] const MFVideoAlphaBitmap *pBmpParms
);

参数

[in] pBmpParms

指向 MFVideoAlphaBitmap 结构的指针,该结构包含有关位图、源矩形和目标矩形、颜色键和其他信息的信息。

返回值

该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
方法成功。
E_INVALIDARG
pBmpParms 结构中定义的混合参数无效。

备注

应用程序可以提供图像作为 GDI 位图或 Direct3D 图面。 EVR 混音器将图像与下一个视频帧和所有后续帧混合,直到图像发生更改或删除。 图像可以包含嵌入的每像素 alpha 信息,以便可以定义透明区域。 还可以使用颜色键值来标识透明区域。

如果使用 Direct3D 图面,则图面格式必须为 32 位 RGB(D3DFMT_X8R8G8B8或D3DFMT_A8R8G8B8),并且表面必须从D3DPOOL_SYSTEMMEM内存池中分配。

将图像传递到视频呈现器的频率没有定义限制。 但是,每秒更改图像几次可能会影响视频的性能和流畅性。

示例

以下示例设置用于 alpha 混合的 GDI 位图。 就本示例而言,它使用目标矩形和 alpha 值的预定义设置。

HRESULT EVRPlayer::SetBitmapImage(BOOL bEnable, HBITMAP hBitmap)
{
    const float fBitmapAlpha = 0.5f; 

    HRESULT hr = S_OK;

    // To enable the bitmap, you must supply a valid bitmap handle.
    if (bEnable && (hBitmap == NULL))
    {
        return E_INVALIDARG;
    }
    
    // Make sure we have an IMFVideoMixerBitmap pointer.
    if (m_pMixerBitmap == NULL)
    {
        return E_FAIL;
    }

    if (bEnable)
    {
        // Place the bitmap in the lower-right quadrant of the video.
        MFVideoNormalizedRect nrcDest = { 0.5f, 0.5f, 1.0f, 1.0f };

        // Get the device context for the video window.
        HDC hdc = GetDC(m_hwndVideo);

        // Create a compatible DC and select the bitmap into the DC>
        HDC hdcBmp = CreateCompatibleDC(hdc);
        HBITMAP hOld = (HBITMAP)SelectObject(hdcBmp, hBitmap);

        // Fill in the blending parameters.
        MFVideoAlphaBitmap bmpInfo;
        ZeroMemory(&bmpInfo, sizeof(bmpInfo));
        bmpInfo.GetBitmapFromDC = TRUE; // Use a bitmap DC (not a Direct3D surface).
        bmpInfo.bitmap.hdc = hdcBmp;
        bmpInfo.params.dwFlags = 
            MFVideoAlphaBitmap_Alpha | MFVideoAlphaBitmap_DestRect;
        bmpInfo.params.fAlpha = fBitmapAlpha;
        bmpInfo.params.nrcDest = nrcDest;

        // Get the bitmap dimensions.
        BITMAP bm;
        GetObject(hBitmap, sizeof(BITMAP), &bm);

        // Set the source rectangle equal to the entire bitmap.
        SetRect(&bmpInfo.params.rcSrc, 0, 0, bm.bmWidth, bm.bmHeight);

        // Set the bitmap.
        hr = m_pMixerBitmap->SetAlphaBitmap(&bmpInfo);

        SelectObject(hdcBmp, hOld);
        DeleteDC(hdcBmp);
        ReleaseDC(m_hwndVideo, hdc);
    }
    else
    {
        hr = m_pMixerBitmap->ClearAlphaBitmap();
    }
    return hr;
}

要求

   
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 evr9.h
Library Strmiids.lib

请参阅

增强的视频呈现器

IMFVideoMixerBitmap