Partager via


Afficher une image bitmap fournie par l’application sur l’image composite

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les applications peuvent utiliser le mode de mixage de VMR pour afficher des logos de canaux alpha-mélangés, une interface utilisateur ou des publicités partiellement ou entièrement dans le rectangle vidéo. Étant donné que la fusion est effectuée dans le matériel par le processeur graphique, l’impact sur les performances de lecture du flux vidéo est minimal et aucun artefact scintillement ou déchirant n’est détectable. Les applications peuvent modifier l’image affichée aussi fréquemment qu’elles le souhaitent. Il convient de noter que les modifications ne sont reflétées à l’écran que lorsque le graphique de filtre DirectShow est à l’état en cours d’exécution.

Le VMR utilise son composant de mélangeur pour superposer l’image bitmap sur l’image composite. Avec VMR-7, l’application doit forcer le VMR à charger son mélangeur, même s’il n’existe qu’un seul flux vidéo. Cela n’est pas nécessaire avec le VMR-9, car il charge son mélangeur par défaut.

Pour mélanger une image bitmap statique avec le flux vidéo, l’application crée le VMR et l’ajoute au graphique, puis appelle IVMRFilterConfig::SetNumberOfStreams. La valeur passée à cette fonction identifie le nombre de broches d’entrée que le VMR doit créer. Les applications peuvent spécifier n’importe quelle valeur comprise entre 1 et MAX_MIXER_STREAMS ; la spécification d’une valeur 1 est valide si l’application n’a l’intention d’afficher qu’un seul flux vidéo. Même si le VMR-7 a une seule broche d’entrée par défaut, cette méthode doit être appelée pour l’obliger à charger son composant de mélangeur. (Le VMR-9 charge son mélangeur et configure quatre broches par défaut.)

Pour définir l’image bitmap, utilisez l’interface IVMRMixerBitmap sur vmR-7 ou l’interface IVMRMixerBitmap9 sur le VMR-9.

La bitmap peut être spécifiée par un handle dans un contexte d’appareil GDI (hDC) ou par une interface Surface DirectDraw. Si l’application souhaite que l’image contienne des informations alpha incorporées (également appelées par pixel alpha), elle doit placer les données d’image dans une interface Surface DirectDraw. En effet, il n’est actuellement pas possible de placer des informations alpha par pixel avec un contexte d’appareil GDI. La surface DirectDraw doit être RVB32 ou ARGB32 et doit de préférence être une surface de mémoire système. Il n’est pas nécessaire que les dimensions de surface soient d’une puissance de 2.

Le VMR permet aux applications de spécifier l’emplacement et une valeur de transparence globale pour l’image. Le code suivant montre comment transmettre des données d’image au VMR pour un fusion suivant :

HRESULT BlendApplicationImage( 
  HWND hwndApp,
  IVMRWindowlessControl* pWc,
  HBITMAP hbm
)
{
    LONG cx, cy;
    HRESULT hr;
    hr = pWc->GetNativeVideoSize(&cx, &cy, NULL, NULL);
    if (FAILED(hr))
        return hr;
    
    HDC hdc = GetDC(hwndApp);
    if (hdc == NULL)
    {
        return E_FAIL;
    }
    
    HDC hdcBmp = CreateCompatibleDC(hdc);
    ReleaseDC(hwndApp, hdc);
    
    if (hdcBmp == NULL)
    {
        return E_FAIL;
    }
    
    BITMAP bm;
    if (0 == GetObject(hbm, sizeof(bm), &bm))
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);
    if (hbmOld == 0)
    {
        DeleteDC(hdcBmp);
        return E_FAIL;
    }
    
    VMRALPHABITMAP bmpInfo;
    ZeroMemory(&bmpInfo, sizeof(bmpInfo) );
    bmpInfo.dwFlags = VMRBITMAP_HDC;
    bmpInfo.hdc = hdcBmp;
    
    // Show the entire bitmap in the top-left corner of the video image.
    SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);
    bmpInfo.rDest.left = 0.f;
    bmpInfo.rDest.top = 0.f;
    bmpInfo.rDest.right = (float)bm.bmWidth / (float)cx;
    bmpInfo.rDest.bottom = (float)bm.bmHeight / (float)cy;
    
    // Set the transparency value (1.0 is opaque, 0.0 is transparent).
    bmpInfo.fAlpha = 0.2f;
    
    IVMRMixerBitmap* pBmp;
    hr = pWc->QueryInterface(IID_IVMRMixerBitmap, (LPVOID *)&pBmp);
    if (SUCCEEDED(hr)) 
    {
        pBmp->SetAlphaBitmap(&bmpInfo);
        pBmp->Release();
    }
    
    DeleteObject(SelectObject(hdcBmp, hbmOld));
    DeleteDC(hdcBmp);
    return hr;
}

Les concepts abordés dans cette rubrique sont présentés dans l’exemple d’application VMRPlayer .

Création d’animations simples avec l’image Bitmap

Pour créer un logo bitmap animé simple, placez tous les « frames » bitmap dans une seule image, comme illustré dans l’illustration suivante.

Bande d’images vmr

Lorsque vous définissez initialement la bitmap à l’aide d’IVMRMixerBitmap::SetAlphaBitmap, si la bitmap se trouve dans un HDC, définissez le champ rSrc de la structure VMRALPHABITMAP pour spécifier la taille de l’intégralité de l’image bitmap dans le HDC. Les membres supérieurs et gauches de la structure sont définis sur 0, et les membres de droite et inférieur sont la largeur et la hauteur de la bitmap. Si l’image bitmap se trouve dans une surface DirectDraw, la taille de la surface étant connue, il n’est pas nécessaire de spécifier rSrc dans cette méthode.

Lorsque vous appelez IVMRMixerBitmap::UpdateAlphaBitmapParameters, utilisez le membre rSrc pour les bitmaps HDC et DirectDraw, pour spécifier le cadre ou le rectangle particulier dans l’image que vous souhaitez afficher, et définissez l’indicateur VMRBITMAP_SRCRECT dans le membre dwFlags .

Utilisation du mode de mixage VMR