Я делал это раньше. У вас есть два варианта.
Используйте возможности микшера VMR-7 или VMR-9. Я гарантирую вам, что это будет выглядеть очень уродливо, потому что фильтры VMR вообще не могут выполнять альфа-смешивание. Ваш водяной знак будет иметь грубые края.
Реализуйте класс фильтра, производный от CTransInPlaceFilter.
Вы реализуете следующие методы:
CheckMediaType (accept all RGB formats)
SetMediaType (accept all RGB formats)
Transform (this is where you do the overlay)
В конструкторе вашего фильтра (или в каком-либо другом методе, который вызывается перед запуском графика) загрузите водяной знак из файла или ресурсов. Сохраните биты растрового изображения файла изображения в буфер.
При вызове Transform откройте переданный IMediaSample, получите доступ к его буферу и создайте цикл с двойным вложением for для копирования каждого пикселя водяного знака в буфер изображения.
Одна проблема со всем этим заключается в том, что ваш источник входного сигнала может не быть родным RGB. Например, большинство веб-камер являются источниками YUV (или, что еще хуже, MJPG). Ограничение вашего фильтра только приемом типов RGB заставит загружать фильтры преобразователя цвета DShow. Таким образом, к вашему графику может быть добавлена дополнительная задержка. Что касается альфа-смешивания (если вы этого хотите), здесь вы сами — исходный буфер, который вы накладываете поверх него, скорее всего, будет RGB24 без альфа-канала.
person
selbie
schedule
06.04.2010