次の方法で共有


IMediaDet::GetBitmapBits メソッド

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

Note

[非推奨。 この API は、Windows の今後のリリースから削除される可能性があります。]

 

メソッドは GetBitmapBits 、指定されたメディア時刻にビデオ フレームを取得します。 返されるフレームは、常に 24 ビット RGB 形式です。

構文

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

パラメーター

StreamTime

ビデオ フレームを取得する時間 (秒単位)。

pBufferSize

必要なバッファー サイズを受け取ります。 pBufferNULL の場合、変数はフレームの取得に必要なバッファーのサイズを受け取ります。 pBufferNULL でない場合、このパラメーターは無視されます。

pBuffer

BITMAPINFOHEADER 構造体とそれに続く DIB ビットを受け取るバッファーへのポインター。

Width

ビデオ 画像の幅 (ピクセル単位)。

Height

ビデオ 画像の高さ (ピクセル単位)。

戻り値

HRESULT 値を返します。 次の値があります。

リターン コード 説明
S_OK
成功しました。
E_NOINTERFACE
サンプル グラバー フィルターをグラフに追加できませんでした。
E_OUTOFMEMORY
メモリ不足です。
E_POINTER
NULL ポインター エラー。
E_UNEXPECTED
予期しないエラー。
VFW_E_INVALIDMEDIATYPE
メディアの種類が無効です。

 

解説

このメソッドを呼び出す前に、 IMediaDet::p ut_FilenameIMediaDet::p ut_CurrentStream を呼び出して、ファイル名とストリームを設定します。

必要なバッファーのサイズを確認するには、 pBufferNULL に等しいこのメソッドを呼び出します。 サイズは、 pBufferSize が指す変数で返されます。 次に、バッファーを作成し、 pBuffer がバッファーのアドレスと等しいメソッドをもう一度呼び出します。 メソッドが返されると、バッファーには BITMAPINFOHEADER 構造体の後にビットマップが格納されます。 ビットマップは、 Width パラメーターと Height パラメーターで指定された寸法にスケーリングされます。

このメソッドは、メディア検出機能をビットマップ グラブ モードにします。 このメソッドが呼び出されると、メディア検出機能の新しいインスタンスを作成しない限り、 IMediaDet のさまざまなストリーム情報メソッドは機能しません。

Note

ヘッダー ファイル Qedit.h は、バージョン 7 より後の Direct3D ヘッダーと互換性がありません。

 

Note

Qedit.h を取得するには、Windows Vista および .NET Framework 3.0 用の Microsoft Windows SDK Update をダウンロードします。 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;
}

要件

要件
ヘッダー
Qedit.h
ライブラリ
Strmiids.lib

関連項目

IMediaDet インターフェイス

エラーコードと成功コード