IMediaDet::GetBitmapBits 方法
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
注意
[已弃用。 此 API 可能会从 Windows 的未来版本中删除。]
方法 GetBitmapBits
在指定的媒体时间检索视频帧。 返回的帧始终采用 24 位 RGB 格式。
语法
HRESULT GetBitmapBits(
double StreamTime,
long *pBufferSize,
char *pBuffer,
long Width,
long Height
);
参数
-
StreamTime
-
检索视频帧的时间(以秒为单位)。
-
pBufferSize
-
接收所需的缓冲区大小。 如果 pBuffer 为 NULL,则变量接收检索帧所需的缓冲区大小。 如果 pBuffer 不为 NULL,则忽略此参数。
-
pBuffer
-
指向接收 BITMAPINFOHEADER 结构后跟 DIB 位的缓冲区的指针。
-
Width
-
视频图像的宽度(以像素为单位)。
-
Height
-
视频图像的高度(以像素为单位)。
返回值
返回 HRESULT 值。 可能的值如下所示:
返回代码 | 说明 |
---|---|
|
成功。 |
|
无法将 示例抓取器 筛选器添加到图形。 |
|
内存不足。 |
|
NULL 指针错误。 |
|
意外错误。 |
|
媒体类型无效。 |
备注
在调用此方法之前,请通过调用 IMediaDet::p ut_Filename 和 IMediaDet::p ut_CurrentStream 来设置文件名和流。
若要确定所需的缓冲区的大小,请使用 pBuffer 等于 NULL 调用此方法。 大小在 pBufferSize 指向的变量中返回。 然后创建缓冲区并再次调用 方法, pBuffer 等于缓冲区的地址。 方法返回时,缓冲区包含 位图后跟的 BITMAPINFOHEADER 结构。 位图将缩放到 Width 和 Height 参数中指定的尺寸。
此方法将媒体检测器置于位图抓取模式。 调用此方法后,除非创建媒体检测器的新实例,否则 IMediaDet 中的各种流信息方法将不起作用。
注意
头文件 Qedit.h 与版本 7 之后的 Direct3D 标头不兼容。
注意
若要获取 Qedit.h,请下载适用于 Windows Vista 和 .NET Framework 3.0 的Microsoft Windows SDK更新。 Qedit.h 在 Windows 7 和 .NET Framework 3.5 Service Pack 1 的Microsoft Windows SDK中不可用。
示例
以下代码使用 GetBitmapBits
方法创建与设备无关的位图。
long size;
hr = pDet->GetBitmapBits(0, &size, 0, width, height);
if (SUCCEEDED(hr))
{
char *pBuffer = new char[size];
if (!pBuffer)
return E_OUTOFMEMORY;
try {
hr = pDet->GetBitmapBits(0, 0, pBuffer, width, height);
}
catch (...) {
delete [] pBuffer;
throw;
}
if (SUCCEEDED(hr))
{
BITMAPINFOHEADER *bmih = (BITMAPINFOHEADER*)pBuffer;
HDC hdcDest = GetDC(0);
// Find the address of the start of the image data.
void *pData = pBuffer + sizeof(BITMAPINFOHEADER);
// Note: In general a BITMAPINFOHEADER can include extra color
// information at the end, so calculating the offset to the image
// data is not generally correct. However, the IMediaDet interface
// always returns an RGB-24 image with no extra color information.
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
CopyMemory(&(bmi.bmiHeader), bmih, sizeof(BITMAPINFOHEADER));
HBITMAP hBitmap = CreateDIBitmap(hdcDest, bmih, CBM_INIT,
pData, &bmi, DIB_RGB_COLORS);
}
delete[] pBuffer;
}
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|
另请参阅