Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с захватом кадров видео (WinAPI) 
:(
    Опции темы
A_ndrey
Дата 3.3.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.3.2008

Репутация: нет
Всего: нет



Написал нижеприведенную ф-ию для захвата кадра с любого места окна/экрана и отображения его в окне/экране. Если захватывть статическое изображение - все работает, при захвате видео выводиться черный кадр, который при позиционировании его над видео просвечивается. В чем может быть проблема? 
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;
}


PM MAIL   Вверх
atavinta
Дата 13.3.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.1.2008
Где: Москва

Репутация: нет
Всего: нет



Точно не знаю, не пробовал. Знаю только, что кадр видео нельзя сняить принтскином.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.