C++ Adobe Premiere video filter-печать/рисование / рендеринг текста в выходном видеокадре


Я хочу написать фильтр видео для Adobe Premiere,и мне нужно распечатать/нарисовать / отрисовать некоторый текст в выходной видеокадр.

Заглянув в adobe premiere cs4 sdk, я не смог найти быстрого ответа - возможно ли это?

Пожалуйста, предоставьте несколько образцов!

Спасибо!

1 2
c++

1 ответ:

Некоторую стратегию я попытаюсь реализовать:

  1. нарисуйте текст с помощью GDI в растровое изображение размера кадра (VideoHandle - >piSuites - >ppixFuncs - >ppixGetBounds)
  2. наложение пикселей кадра (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 [когда - нибудь :)] нужно хранить растровое изображение в памяти один раз вместо того, чтобы создавать каждый раз на кадр...