EsakkiRaja Ответов: 2

Как провести черту над потоковым видео?


Привет, я хочу провести черту над потоковым видео в реальном времени в приложении windows, сделанном с помощью directshow на c++.

Что я уже пробовал:

До сих пор я пытался нарисовать прямоугольник над потоковой передачей с помощью функции FillRect, и результат был получен . но мне нужно провести линию от любой точки к любой точке.

Afzaal Ahmad Zeeshan

Вы можете попробовать иметь прямоугольник высотой 1 пиксель. :-)

EsakkiRaja

я попробовал это сделать, но для прямой линии как по оси x, так и по оси y все хорошо, но когда я хочу нарисовать линию с наклоном, это означает, что нарисовать ее невозможно..

Afzaal Ahmad Zeeshan

Надеюсь, там тоже будет доступна функция поворота. :Д

Richard MacCutchan

Тогда не используйте FillRect, используйте один из методов рисования линий W.

EsakkiRaja

есть ли какие-либо методы рисования линий, чтобы нарисовать поверх видео..если да, то дайте мне знать?

2 Ответов

Рейтинг:
17

KarstenK

Лучший способ-создать самое верхнее окно с прозрачным фоном, а затем нарисовать в нем линию.


EsakkiRaja

Спасибо..Мне нужно нарисовать линию, когда я нажимаю кнопку мыши, поэтому из вашего решения можно ли создать прозрачное окно по щелчку мыши? если да, то как визуализировать его в видеодендере VMR9?

Рейтинг:
11

EsakkiRaja

drawLine1(int xx1, int yy1, int xx2, int yy2,HDC hdcBmp) 
{
	RECT clntRc;
	int temp,s1,s2,swap;
	x = xx1;
	y = yy1;
	dx = abs(xx2 - xx1);
	dy = abs(yy2 - yy1);
	s1 = sign(xx2 - xx1); 
	s2 = sign(yy2 - yy1);
	swap = 0;
	if (dy > dx)
	{ 
		temp = dx; 
		dx = dy;
		dy = temp;
		swap = 1;
	}
	p = 2*dy - dx;
	for (int i = 0; i < dx; i++)
	{
		clntRc.left =x;
		clntRc.top = y;
		clntRc.right = x;
		clntRc.bottom =y;	
		FrameRect(hdcBmp,&clntRc,CreateSolidBrush(RGB(255,0,0)));

		while (p >= 0)
		{ 
			p = p - 2*dx; 
			if (swap)
				x += s1; 
			else
				y += s2;
		}
			p = p + 2*dy; 
			if (swap) 
				y += s2; 
			else 
				x += s1;
	}
}


drawlineOverlay()
{
	int cx, cy,count;
    HRESULT hr;
	HBITMAP hbm;
	RECT rcClient;
	

	GetResolution(&cx,&cy);

	GetClientRect(m_hwndApp,&rcClient);

    HDC hdc = GetDC(m_hwndApp);

    if (hdc == NULL)
    {
        return E_FAIL;
    }
    
    HDC hdcBmp = CreateCompatibleDC(hdc);    
    if (hdcBmp == NULL)
    {
        return E_FAIL;
    }
    
	hbm = CreateCompatibleBitmap(hdc,cx,cy);

	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;
    }				
	
	if(g_bTOFToFindAreaSelect)
	{
		count = g_SelectedCoordinatesValue;
		for(int i = 1;i <= count;i++)
		{
			if(i == count)
				drawLine1(xxpos[i], yypos[i], xxpos[1], yypos[1],hdcBmp);
			else
				drawLine1(xxpos[i], yypos[i], xxpos[i+1], yypos[i+1],hdcBmp);
		}
	}

	if(g_bTOFToFindLengthSelect)
	{
		drawLine1(xx1, yy1, xx2, yy2,hdcBmp);	
	}
  

	VMR9AlphaBitmap bmpInfo;
	ZeroMemory(&bmpInfo, sizeof(bmpInfo) );

	bmpInfo.dwFlags = VMRBITMAP_HDC | VMRBITMAP_SRCCOLORKEY;

	bmpInfo.hdc = hdcBmp;
	        
	SetRect(&bmpInfo.rSrc, 0, 0, bm.bmWidth, bm.bmHeight);   
	bmpInfo.rDest.left = 0.f;
	bmpInfo.rDest.top = 0.f;
	//bmpInfo.rDest.right = bmpInfo.rDest.left + ((float)bm.bmWidth / (float)cx); 
	//bmpInfo.rDest.bottom = bmpInfo.rDest.top + ((float)bm.bmHeight / (float)cy);
	bmpInfo.rDest.right = 1.f;
	bmpInfo.rDest.bottom = 1.f;

	// Set the transparency value (1.0 is opaque, 0.0 is transparent).
	bmpInfo.fAlpha = 0.5f;	
	bmpInfo.clrSrcKey = RGB(0,0,0);

	if(m_pVideoRender != NULL)
	{
		IVMRMixerBitmap9* pBmp;	
		hr = m_pVideoRender->QueryInterface(IID_IVMRMixerBitmap9, (LPVOID *)&pBmp);
		if (SUCCEEDED(hr)) 
		{
			hr = pBmp->SetAlphaBitmap(&bmpInfo);
			if(FAILED(hr))
			{
				PrintMessage(L"pBmp->SetAlphaBitmap hr = 0x%x  GetLastError() = %d\r\n",hr,GetLastError());
			}
			hr = pBmp->Release();
			if(FAILED(hr))
			{
				PrintMessage(L"pBmp->Release hr = 0x%x  GetLastError() = %d\r\n",hr,GetLastError());
			}
		}
	}
	

	// Clean up.
	ReleaseDC(m_hwndApp, hdc);
	DeleteBitmap(hbm);
	DeleteObject(SelectObject(hdcBmp, hbmOld));
	DeleteDC(hdcBmp);
    return hr;
}



я получил решение...спасибо всем!!!