CDrawImage 类
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
类 CDrawImage
是一个帮助程序类,用于管理视频呈现器筛选器的绘图。 所有绘图操作都使用 GDI 执行。 此类不支持使用 DirectDraw 进行呈现。 类 CDrawImage
要求拥有筛选器也使用 CBaseWindow 类,该类管理视频窗口。 构造 CDrawImage
函数采用指向 CBaseWindow 对象的指针。
下图显示了在自定义视频呈现器筛选器中使用此类的首选方法。
若要使用此类,请执行以下操作:
- 当引脚连接时,调用 CDrawImage::NotifyMediaType 和 CDrawImage::NotifyAllocator 方法。
- 每当媒体类型更改时,请再次调用 NotifyMediaType 。
- 在进行任何呈现之前,请调用 CDrawImage::SetDrawContext。
- 如果源矩形发生更改,则调用 CDrawImage::SetSourceRect ;如果目标矩形发生更改,则调用 CDrawImage::SetTargetRect 。
- 管理淡化图像的调色板,如以下调色板部分所述。
Allocators
上图中显示的筛选器使用自定义分配器类 CImageAllocator。 此分配器使用 GDI CreateDIBSection 函数在共享内存中创建 DIB。 分配器创建的示例是 CImageSample 对象。
如果筛选器拥有连接的分配器,则保证媒体样本为 CImageSample 对象。 在这种情况下, CDrawImage 对象可以使用 BitBlt 或 StretchBlt 优化绘图。 否则,它必须使用较慢的 SetDIBitsToDevice 或 StretchDIBits 函数。 更快的选项由 CDrawImage::FastRender 方法实现,较慢选项由 CDrawImage::SlowRender 方法实现。 (尽管有这个名称,但在 SlowRender 中可能不会看到较大的性能下降,尤其是在较新的硬件上。)
调色板
如果使用 FastRender 方法进行绘制,并且图像已淡化,则筛选器需要管理调色板,如下所示:
- CImageSample 类包含存储在 DIBDATA 结构中的调色板版本号。 分配器创建示例时,将初始化 值。
- CDrawImage 类还包含调色板版本号,该版本号在创建时初始化。
- 每当媒体类型更改为新的 palettized 格式时,请调用 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 对象。 |
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|