CDrawImage 类

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

CDrawImage 是一个帮助程序类,用于管理视频呈现器筛选器的绘图。 所有绘图操作都使用 GDI 执行。 此类不支持使用 DirectDraw 进行呈现。 类 CDrawImage 要求拥有筛选器也使用 CBaseWindow 类,该类管理视频窗口。 构造 CDrawImage 函数采用指向 CBaseWindow 对象的指针。

下图显示了在自定义视频呈现器筛选器中使用此类的首选方法。

使用 cdrawimage 的自定义视频呈现器

若要使用此类,请执行以下操作:

Allocators

上图中显示的筛选器使用自定义分配器类 CImageAllocator。 此分配器使用 GDI CreateDIBSection 函数在共享内存中创建 DIB。 分配器创建的示例是 CImageSample 对象。

如果筛选器拥有连接的分配器,则保证媒体样本为 CImageSample 对象。 在这种情况下, CDrawImage 对象可以使用 BitBlt 或 StretchBlt 优化绘图。 否则,它必须使用较慢的 SetDIBitsToDeviceStretchDIBits 函数。 更快的选项由 CDrawImage::FastRender 方法实现,较慢选项由 CDrawImage::SlowRender 方法实现。 (尽管有这个名称,但在 SlowRender 中可能不会看到较大的性能下降,尤其是在较新的硬件上。)

调色板

如果使用 FastRender 方法进行绘制,并且图像已淡化,则筛选器需要管理调色板,如下所示:

  • CImageSample 类包含存储在 DIBDATA 结构中的调色板版本号。 分配器创建示例时,将初始化 值。
  • CDrawImage 类还包含调色板版本号,该版本号在创建时初始化。
  • 每当媒体类型更改为新的 palettized 格式时,请调用 CDrawImage::IncrementPaletteVersion。 此方法递增 CDrawImage 对象的调色板版本号。 如果筛选器使用 CImagePalette 类来管理调色板信息,则只需在媒体类型更改时调用 CImagePalette::P reparePalettePreparePalette 方法仅在必要时递增调色板版本。
  • FastRender 方法将 CDrawImage 调色板版本与示例的调色板版本进行比较。 如果示例的版本号落后于 CDrawImage 版本号, FastRender 方法将调用 CDrawImage::UpdateColourTableUpdateColourTable 方法使用 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 使用 BitBltStretchBlt 函数绘制视频图像。
SetStretchMode 计算是否必须拉伸视频图像。
SlowRender 使用 SetDIBitsToDeviceStretchDIBits 函数绘制视频图像。
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 (调试生成)