Compartilhar via


Método IMFVideoMixerBitmap::SetAlphaBitmap (evr9.h)

Define uma imagem de bitmap para o EVR (renderizador de vídeo) aprimorado para a mistura alfa com o vídeo.

Sintaxe

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

Parâmetros

[in] pBmpParms

Ponteiro para uma estrutura MFVideoAlphaBitmap que contém informações sobre o bitmap, os retângulos de origem e destino, a chave de cor e outras informações.

Valor retornado

O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.

Código de retorno Descrição
S_OK
O método foi bem-sucedido.
E_INVALIDARG
Os parâmetros de mesclagem definidos na estrutura pBmpParms não são válidos .

Comentários

O aplicativo pode fornecer a imagem como um bitmap GDI ou como uma superfície Direct3D. O mixer EVR combina a imagem com o próximo quadro de vídeo e todos os quadros subsequentes, até que a imagem seja alterada ou removida. A imagem pode conter informações alfa inseridas por pixel para que regiões transparentes possam ser definidas. Áreas transparentes também podem ser identificadas usando um valor de chave de cor.

Se você usar uma superfície Direct3D, o formato de superfície deverá ser RGB de 32 bits, D3DFMT_X8R8G8B8 ou D3DFMT_A8R8G8B8 e a superfície deverá ser alocada do pool de memória D3DPOOL_SYSTEMMEM.

Não há um limite definido para a frequência com que você pode passar imagens para o renderizador de vídeo. No entanto, alterar a imagem várias vezes por segundo pode afetar o desempenho e a suavidade do vídeo.

Exemplos

O exemplo a seguir define um bitmap GDI para mesclagem alfa. Para fins do exemplo, ele usa configurações predefinidas para o retângulo de destino e o valor alfa.

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;
}

Requisitos

   
Cliente mínimo com suporte Windows Vista [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho evr9.h
Biblioteca Strmiids.lib

Confira também

Renderizador de Vídeo Aprimorado

IMFVideoMixerBitmap