IMediaDet::GetBitmapBits 方法

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

注意

[已被取代。 此 API 可能會從未來的 Windows 版本中移除。]

 

方法 GetBitmapBits 會在指定的媒體時間擷取視訊畫面。 傳回的框架一律為 24 位 RGB 格式。

語法

HRESULT GetBitmapBits(
   double StreamTime,
   long   *pBufferSize,
   char   *pBuffer,
   long   Width,
   long   Height
);

參數

StreamTime

擷取視訊畫面的時間,以秒為單位。

pBufferSize

接收所需的緩衝區大小。 如果 pBufferNull,變數會收到擷取框架所需的緩衝區大小。 如果 pBuffer 不是 Null,則會忽略此參數。

pBuffer

接收 BITMAPINFOHEADER 結構的緩衝區指標,後面接著 DIB 位。

寬度

視訊影像的寬度,以圖元為單位。

高度

視訊影像的高度,以圖元為單位。

傳回值

傳回 HRESULT 值。 可能的值如下:

傳回碼 描述
S_OK
成功。
E_NOINTERFACE
無法將 範例擷取器 篩選新增至圖形。
E_OUTOFMEMORY
記憶體不足。
E_POINTER
Null 指標錯誤。
E_UNEXPECTED
非預期的錯誤。
VFW_E_INVALIDMEDIATYPE
不正確媒體類型。

 

備註

呼叫此方法之前,請先呼叫 IMediaDet::p ut_FilenameIMediaDet::p ut_CurrentStream來設定檔案名和資料流程。

若要判斷所需的緩衝區大小,請使用 pBuffer 等於 Null呼叫這個方法。 大小會在 pBufferSize所指向的變數中傳回。 然後建立緩衝區,然後再次呼叫 方法,並將 pBuffer 等於緩衝區的位址。 當方法傳回時,緩衝區會包含 BITMAPINFOHEADER 結構,後面接著點陣圖。 點陣圖會縮放至 WidthHeight 參數中指定的維度。

這個方法會將媒體偵測器放入點陣圖抓取模式。 呼叫此方法之後,除非建立媒體偵測器的新實例, 否則 IMediaDet 中的各種串流資訊方法無法運作。

注意

標頭檔 Qedit.h 與 7 版之後的 Direct3D 標頭不相容。

 

注意

若要取得 Qedit.h,請下載適用于 Windows Vista 的 Microsoft Windows SDK Update 和 .NET Framework 3.0。 Windows 7 和 .NET Framework 3.5 Service Pack 1 Microsoft Windows SDK中無法使用 Qedit.h。

 

範例

下列程式碼會 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;
}

規格需求

需求
標頭
Qedit.h
程式庫
Strmiids.lib

另請參閱

IMediaDet 介面

錯誤和成功碼