Класс 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::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 . |
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|