Directshow 如何在視頻中插入水印Logo圖片

下面介紹如何在視頻文件中加入自己的水印圖片及LOGO


typedef struct _VMRALPHABITMAP {   

 DWORD dwFlags;                                                                                                          //指明從哪兒獲取位圖

HDC hdc;                                                                                                                         //指定的設備上下文DC。如果指定爲NULL,則位圖是從一個DirectDraw surface上獲取。

LPDIRECTDRAWSURFACE7 pDDS;                                                                            // 指向 DirectDraw surface的一個指針。如果指定爲NULL則,位圖是從GDI DC中獲取。

RECT rSrc;                                                                                                                     //指明源矩形

NORMALIZEDRECT rDest;                                                                                            //指定目標矩形

 FLOAT fAlpha;                                                                                                               //指定alpha混合值,必須有一個在0.0到1.0之間的值(含) 。

COLORREF clrSrcKey;                                                                                                  //指定需要取消圖片的背景顏色

} VMRALPHABITMAP;typedef struct _VMRALPHABITMAP *PVMRALPHABITMAP;

 

dwFlags應爲以下值

 

VMRBITMAP_DISABLE (0x00000001) 現在不需要位圖
VMRBITMAP_HDC (0x00000002) 從HDC中獲取位圖
VMRBITMAP_ENTIREDDS (0x00000004) 從整個DirectDraw surface獲取位圖.當這個被指定時, 指定rSrc沒有用.
VMRBITMAP_SRCCOLORKEY (0x00000008) clrSrcKey 值可用,當在混合運算渲染位圖時,這個值將被用到
VMRBITMAP_SRCRECT (0x00000010)

 

HRESULT CVMRPlayMovive::BlendApplicationImage(HWND hwndApp)
{
LONG cx, cy;
HRESULT hr;
RECT rc={0};
hr = pWC->GetNativeVideoSize(&cx, &cy, NULL, NULL);
if (FAILED(hr))
return hr;


HINSTANCE hInstance = (HINSTANCE)GetWindowLong(m_hwnd,GWL_HINSTANCE); 
HBITMAP hbm = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP3));
    //加載位圖
BITMAP bm;
HBITMAP hbmOld;
HDC hdc = GetDC(hwndApp);
HDC hdcBmp = CreateCompatibleDC(hdc);
ReleaseDC(hwndApp, hdc);
GetObject(hbm, sizeof(bm), &bm);
hbmOld = (HBITMAP)SelectObject(hdcBmp, hbm);


VMRALPHABITMAP bmpInfo;
ZeroMemory(&bmpInfo, sizeof(bmpInfo) );
bmpInfo.dwFlags = VMRBITMAP_HDC;
bmpInfo.hdc = hdcBmp;




g_nBitmapWidth = bm.bmWidth;
g_nImageWidth  = bm.bmWidth / NUM_IMAGES_IN_BITMAP;
SetRect(&rc,0,0,g_nBitmapWidth, bm.bmHeight);
bmpInfo.rSrc = rc;


// rDest specifies the destination rectangle in composition space (0.0f to 1.0f)
bmpInfo.rDest.left   = (float)(cx - g_nImageWidth) / (float)cx - EDGE_BUFFER;
bmpInfo.rDest.top    = (float)(cy - bm.bmHeight)   / (float)cy - EDGE_BUFFER;
bmpInfo.rDest.right  = 1.0f - EDGE_BUFFER;
bmpInfo.rDest.bottom = 1.0f - EDGE_BUFFER;


g_rDest = bmpInfo.rDest;
g_rSrc  = bmpInfo.rSrc;


g_fBitmapCompWidth = (float)g_nImageWidth / (float)cx;
bmpInfo.fAlpha = 0.0;


SetColorRef(bmpInfo);


hr = pBMP->SetAlphaBitmap(&bmpInfo);
if (FAILED(hr))
Msg(TEXT("SetAlphaBitmap FAILED!  Bitmap operations will fail. hr=0x%x\r\n"), hr);


// Clean up GDI resources
DeleteObject(SelectObject(hdcBmp, hbmOld));
DeleteObject(hbm);
DeleteDC(hdcBmp);


// If setting the alpha bitmap succeeded, update its parameters
if (SUCCEEDED(hr))
{
SetRect(&rc, 0, 0, g_nImageWidth, bm.bmHeight);
bmpInfo.rSrc = rc;
g_rSrcSingle = rc;
bmpInfo.dwFlags = VMRBITMAP_SRCRECT | VMRBITMAP_SRCCOLORKEY;
bmpInfo.fAlpha = TRANSPARENCY_VALUE;
hr = pBMP->UpdateAlphaBitmapParameters(&bmpInfo);
if (FAILED(hr))
Msg(TEXT("UpdateAlphaBitmapParameters FAILED!  hr=0x%x\r\n"), hr);
}


return hr;
}


void CVMRPlayMovive::SetColorRef(VMRALPHABITMAP& bmpInfo)
{
bmpInfo.clrSrcKey = RGB(255, 0, 0);       
bmpInfo.dwFlags |= VMRBITMAP_SRCCOLORKEY;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章