Класс CDrawImage

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Класс CDrawImage является вспомогательным классом, который управляет рисованием для фильтра отрисовщика видео. Все операции рисования выполняются с помощью GDI. Этот класс не поддерживает отрисовку с помощью DirectDraw. Класс CDrawImage требует, чтобы фильтр владельцев также использовал класс CBaseWindow , который управляет окном видео. Конструктор CDrawImage принимает указатель на объект CBaseWindow .

На следующей схеме показан предпочтительный способ использования этого класса в пользовательском фильтре отрисовщика видео.

пользовательский отрисовщик видео с помощью cdrawimage

Чтобы использовать этот класс, выполните следующие действия.

  • Когда контакты подключаются, вызовите методы CDrawImage::NotifyMediaType и CDrawImage::NotifyAllocator .
  • При изменении типа носителя снова вызывайте NotifyMediaType .
  • Перед отрисовкой вызовите CDrawImage::SetDrawContext.
  • Вызовите CDrawImage::SetSourceRect, если изменяется исходный прямоугольник, и CDrawImage::SetTargetRect, если изменяется целевой прямоугольник.
  • Управление палитрой для палеттизированных изображений, как описано в разделе о палитрах ниже.

Распределители

Фильтр, показанный на предыдущей схеме, использует пользовательский класс распределителя CImageAllocator. Этот распределителя создает DIB-объекты в общей памяти с помощью функции GDI CreateDIBSection . Примеры, созданные распределителем, являются объектами CImageSample .

Если фильтр владеет распределителем для подключения, то примеры мультимедиа гарантированно будут объектами CImageSample . В этом случае объект CDrawImage может оптимизировать рисование с помощью BitBlt или StretchBlt. В противном случае он должен использовать более медленные функции SetDIBitsToDevice или StretchDIBits . Более быстрый параметр реализуется методом CDrawImage::FastRender , а более медленный — методом CDrawImage::SlowRender . (Несмотря на название, вы, вероятно, не увидите большого снижения производительности в SlowRender, особенно на новом оборудовании.)

Палитры

Если для рисования используется метод FastRender , а изображение палетизировано, фильтр должен управлять палитрой следующим образом:

  • Класс CImageSample содержит номер версии палитры, хранящийся в структуре DIBDATA . Значение инициализируется, когда распределителем создается образец.
  • Класс CDrawImage также содержит номер версии палитры, который инициализируется при создании.
  • Всякий раз, когда тип мультимедиа меняется на новый палеттизированный формат, вызовите CDrawImage::IncrementPaletteVersion. Этот метод увеличивает номер версии палитры объекта CDrawImage . Если фильтр использует класс CImagePalette для управления данными палитры, можно просто вызывать CImagePalette::P reparePalette при изменении типа мультимедиа. Метод PreparePalette увеличивает версию палитры только при необходимости.
  • Метод FastRender сравнивает версию палитры CDrawImage с версией палитры примера. Если номер версии примера отстает от номера версии CDrawImage , метод FastRender вызывает CDrawImage::UpdateColourTable. Метод UpdateColourTable задает таблицу цветов в контексте устройства с помощью функции GDI SetDIBColorTable . Кроме того, версия палитры в примере обновляется до текущего номера версии.
  • Если закрепление повторно подключается, фильтр должен вызвать CDrawImage::ResetPaletteVersion , чтобы сбросить версию палитры. При повторном подключении контактов распределителя повторно выделяет все образцы.
Защищенные переменные-члены Описание
m_bStretch Указывает, нужно ли растянуть видеоиними в соответствии с целевым окном.
m_bUsingImageAllocator Указывает, является ли распределителем для пин-соединения объект CImageAllocator .
m_EndSample Указывает время остановки последнего примера.
m_hdc Дескриптор в контексте устройства окна владения.
m_MemoryDC Обработка в контексте устройства памяти окна владения.
m_PaletteVersion Используется для отслеживания изменения палитры.
m_pBaseWindow Указатель на принадлежащий объект CBaseWindow .
m_pMediaType Указатель на текущий тип носителя.
m_SourceRect Задает исходный прямоугольник для рисования.
m_StartSample Указывает время начала последнего примера.
m_TargetRect Указывает целевой прямоугольник для рисования.
Защищенные методы Описание
DisplaySampleTimes Рисует метки времени примера мультимедиа поверх видеоинимка.
FastRender Рисует видеоигрывание с помощью функций BitBlt или StretchBlt .
SetStretchMode Вычисляет, нужно ли растянуть видеоиними.
SlowRender Рисует видеоистопа с помощью функций SetDIBitsToDevice или StretchDIBits .
UpdateColourTable Обновления таблицу цветов новой палитрой.
Открытые методы Описание
CDrawImage Метод конструктора.
Drawimage Рисует видеокадр в окне видео.
DrawVideoImageHere Рисует изображение из примера мультимедиа в указанный контекст устройства.
GetPaletteVersion Извлекает версию палитры.
GetSourceRect Извлекает текущий исходный прямоугольник.
GetTargetRect Извлекает текущий целевой прямоугольник.
IncrementPaletteVersion Увеличивает версию палитры.
NotifyAllocator Сообщает объекту, CDrawImage является ли распределителем для соединения объект CImageAllocator .
NotifyEndDraw Не поддерживается.
NotifyMediaType Уведомляет объект текущего типа мультимедиа.
NotifyStartDraw Не поддерживается.
ResetPaletteVersion Сбрасывает версию палитры.
ScaleSourceRect Масштабирует заданный исходный прямоугольник, если есть разница между собственным размером видео и форматом типа мультимедиа. Виртуальной.
SetDrawContext Задает контексты устройства, используемые для рисования.
SetSourceRect Задает исходный прямоугольник.
SetTargetRect Задает целевой прямоугольник.
UsingImageAllocator Указывает, является ли текущий распределителем объект CImageAllocator .

Требования

Требование Значение
Заголовок
Winutil.h (включая Streams.h)
Библиотека
Strmbase.lib (розничные сборки);
Strmbasd.lib (отладочные сборки)