次の方法で共有


CDrawImage クラス

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

クラスは CDrawImage 、ビデオ レンダラー フィルターの描画を管理するヘルパー クラスです。 すべての描画操作は GDI を使用して実行されます。 このクラスでは、DirectDraw を使用したレンダリングはサポートされていません。 クラスでは CDrawImage 、所有フィルターでビデオ ウィンドウを管理する CBaseWindow クラスも使用する必要があります。 コンストラクターはCDrawImage、CBaseWindow オブジェクトへのポインターを受け取ります。

次の図は、カスタム ビデオ レンダラー フィルターでこのクラスを使用する推奨される方法を示しています。

cdrawimage を使用したカスタム ビデオ レンダラー

このクラスを使用するには、次の操作を行います。

アロケーター

前の図に示したフィルターでは、カスタム アロケーター クラス CImageAllocator が使用されています。 このアロケーターは、GDI CreateDIBSection 関数を使用して、共有メモリに DIB を作成します。 アロケーターによって作成されるサンプルは CImageSample オブジェクトです。

フィルターが接続のアロケーターを所有している場合、メディア サンプルは CImageSample オブジェクトであることが保証されます。 その場合、 CDrawImage オブジェクトは BitBlt または StretchBlt を使用して描画を最適化できます。 それ以外の場合は、低速の SetDIBitsToDevice 関数または StretchDIBits 関数を使用する 必要があります。 高速オプションは 、CDrawImage::FastRender メソッドによって実装されます。これは、 CDrawImage::SlowRender メソッドの低速オプションです。 (名前にもかかわらず、特に新しいハードウェアでは、 SlowRender でパフォーマンスに大きな影響を受けることはありません)。

パレット

描画に FastRender メソッドを使用し、イメージを淡色化する場合、フィルターは次のようにパレットを管理する必要があります。

  • CImageSample クラスには、DIBDATA 構造体に格納されているパレット バージョン番号が含まれています。 値は、アロケーターがサンプルを作成するときに初期化されます。
  • CDrawImage クラスには、作成時に初期化されるパレット バージョン番号も含まれています。
  • メディアの種類が新しい淡色化された形式に変更されるたびに、 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 オブジェクトかどうかを示します。

要件

要件
ヘッダー
Winutil.h (Streams.h を含む)
ライブラリ
Strmbase.lib (製品版ビルド);
Strmbasd.lib (デバッグ ビルド)