Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Проблема с захватом кадров видео (WinAPI)


Автор: A_ndrey 3.3.2008, 15:15
Написал нижеприведенную ф-ию для захвата кадра с любого места окна/экрана и отображения его в окне/экране. Если захватывть статическое изображение - все работает, при захвате видео выводиться черный кадр, который при позиционировании его над видео просвечивается. В чем может быть проблема? 
OS:WinXP  

Код

int fGrabSourceToTarget(HWND hTarget,int iTrgX,int iTrgY,int iWidth,int iHeight,
HWND hSource,int iSrcX,int iSrcY)
{
// указатели на используемые контексты
HDC hSourceDC,hMemDC,hTargetDC;
// указатель на битмап контекста памяти по умолчанию
HBITMAP hOldBit=NULL;
// указатель на новый битмап для контекста памяти
Graphics::TBitmap *hBitmap=NULL;
// флаг ошибки
bool bIsError=false;
int itemp=0;

// Получить контекс на источник
hSourceDC=::GetDC(hSource);
if(hSourceDC==NULL)return 0;
// Получить контекс на целевой объект
hTargetDC=::GetDC(hTarget);
if(hTargetDC==NULL)
{
bIsError=true;
goto mClean;
}

// создать контекст памяти совместимый с
// контекстом источника
hMemDC=::CreateCompatibleDC(hSourceDC);
if(hMemDC==NULL)
{
bIsError=true;
goto mClean;
}

// Для контекста памяти устанавливаем тот же
// режим отображения, что используется в
// контексте источнике

if(!::SetMapMode(hMemDC, GetMapMode(hSourceDC)))
{
bIsError=true;
goto mClean;
}

//создать объект TBitmap
hBitmap=new Graphics::TBitmap();
if(hBitmap==NULL)
{
bIsError=true;
goto mClean;
}

//задать размеры копируемой области
hBitmap->Width=iWidth;
hBitmap->Height=iHeight;

// Сменить bitmap в контексте памяти
hOldBit=::SelectObject(hMemDC,hBitmap->Handle);
if(hOldBit==NULL)
{
bIsError=true;
goto mClean;
}


// грабим изображение из источника в память
if(!BitBlt(hMemDC,0,0,iWidth,iHeight,
           hSourceDC,iSrcX,iSrcY,SRCCOPY))
{
bIsError=true;
goto mClean;
}

/*Что-либо делаем с изображением в памяти*/

// отображаем из памяти в целевой объект
if(!BitBlt(hTargetDC,iTrgX,iTrgY,iWidth,iHeight,
           hMemDC,0,0,SRCCOPY))
{
bIsError=true;
goto mClean;
}

// Метка очистки(освобождения используемых ресурсов)
mClean:
// Востоновить контекст памяти
if(hOldBit!=NULL)::SelectObject(hMemDC,hOldBit);

// удалить объект TBitmap
if(hBitmap!=NULL)delete hBitmap;

// удалить контекст памяти
if(hMemDC!=NULL)::DeleteDC(hMemDC);

// Освободить контекс целевого объекта
if(hTargetDC!=NULL)::ReleaseDC(hTarget,hTargetDC);

// Освободить контекс источника
if(hSourceDC!=NULL)::ReleaseDC(hSource,hSourceDC);

// проверка на ошибку
if(bIsError)return 0;

return 1;
}


Автор: atavinta 13.3.2008, 13:31
Точно не знаю, не пробовал. Знаю только, что кадр видео нельзя сняить принтскином.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)