C++ Adobe Premiere video filter-печать/рисование / рендеринг текста в выходном видеокадре
Я хочу написать фильтр видео для Adobe Premiere,и мне нужно распечатать/нарисовать / отрисовать некоторый текст в выходной видеокадр.
Заглянув в adobe premiere cs4 sdk, я не смог найти быстрого ответа - возможно ли это?
Пожалуйста, предоставьте несколько образцов!
Спасибо!
1 ответ:
Некоторую стратегию я попытаюсь реализовать:
- нарисуйте текст с помощью GDI в растровое изображение размера кадра (VideoHandle - >piSuites - >ppixFuncs - >ppixGetBounds)
- наложение пикселей кадра (VideoHandle - > source) на пиксели растрового изображения
Обновление alt текст http://img413.imageshack.us/img413/6201/adobe.jpg Рабочий образец, используя образец Simple_Video_Filter из SDK...
В начале функции xFilter (short selector, VideoHandle theData) создайте растровое изображение с текстом:
TCHAR szBuffer[50] = {0}; RECT rect; HDC hdc = GetDC(NULL); int iLength = 0; iLength = wsprintf(szBuffer, "Hello World!"); BITMAPINFO bmInfo; memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER)); bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmInfo.bmiHeader.biWidth=100; bmInfo.bmiHeader.biHeight=15; bmInfo.bmiHeader.biPlanes=1; bmInfo.bmiHeader.biBitCount = 32; bmInfo.bmiHeader.biCompression = BI_RGB; //create a temporary dc in memory. HDC pDC = GetDC(0); HDC TmpDC=CreateCompatibleDC(pDC); //create a new bitmap and select it in the memory dc BYTE *pbase; HBITMAP TmpBmp=CreateDIBSection(pDC, &bmInfo,DIB_RGB_COLORS,(void**)&pbase,0,0); HGDIOBJ TmpObj=SelectObject(TmpDC,TmpBmp); SetRect(&rect, 0, 0, 100, 15); DrawText(TmpDC, szBuffer, iLength, &rect, 32);
В середине, где установлен фильтр, вместо
redSource = (redSource + redAdd) & 0x000000ff; greenSource = (greenSource + greenAdd) & 0x000000ff; blueSource = (blueSource + blueAdd) & 0x000000ff;
Использовать
int x = vert; int y = horiz; if(x < 215 && y < 300) { COLORREF c = GetPixel(TmpDC,y-200, 215 - x); if(0 == ((int)GetRValue(c)+(int)GetGValue(c)+(int)GetBValue(c))) { redSource =255; greenSource =255; blueSource =255; } }
И в конце функции очистить память
SelectObject(TmpDC,TmpObj); DeleteDC(TmpDC);
PS [когда - нибудь :)] нужно хранить растровое изображение в памяти один раз вместо того, чтобы создавать каждый раз на кадр...