DirectShow SDK 範例過於複雜,初學者難以入門。本文從最簡單的 Transform Filter 切入,實作一個可即時調整 RGB 色彩的 Filter(命名為 Huang RGB Filter),並透過 GraphEdit 驗證。開發環境:VC6 + Win2000 + DirectX 9.0 SDK。

繼承 CTransformFilter,必須實作:
CheckInputType:驗證輸入 Pin 支援的媒體型別GetMediaType:提供輸出 Pin 支援的媒體型別CheckTransform:檢查輸入/輸出型別是否相容DecideBufferSize:協商配置器屬性Transform(IMediaSample* in, IMediaSample* out):實際資料處理(複製並修改像素)IChangeColor 傳遞 RGB 參數// IChangeColor 介面
STDMETHODIMP Get_RGBColor(BYTE* r, BYTE* g, BYTE* b);
STDMETHODIMP Put_RGBColor(BYTE r, BYTE g, BYTE b);
CColorFilter 同時繼承 CTransformFilter 與實作 IChangeColor,屬性頁 CProp 透過此介面與 Filter 互動。
void AdjustContrast(BYTE* r, BYTE* g, BYTE* b);
void ChangeContrast(RGBQUAD* pElem); // 對單一像素操作
在 Transform 中將輸入樣本資料複製到輸出樣本,再逐像素呼叫 ChangeContrast 修改 RGB 值。
PropPage.ax,執行 regsvr32 PropPage.ax 註冊class CColorFilter : public CTransformFilter,
public IChangeColor {
// 必須覆寫的 CTransformFilter 虛擬函式
HRESULT CheckInputType(const CMediaType* pmtin);
HRESULT GetMediaType(int iPos, CMediaType* pmt);
HRESULT CheckTransform(const CMediaType* mtin, const CMediaType* mtout);
HRESULT DecideBufferSize(IMemAllocator* pAlloc, ALLOCATOR_PROPERTIES* pProp);
HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
// 自訂方法
void AdjustContrast(BYTE* r, BYTE* g, BYTE* b);
HRESULT Transform(AM_MEDIA_TYPE* pDest);
HRESULT Transform(IMediaSample* pSample);
HRESULT Copy(IMediaSample* pIn, IMediaSample* pOut);
void ChangeContrast(RGBQUAD* pElem);
// IChangeColor 實作
STDMETHODIMP Get_RGBColor(BYTE* r, BYTE* g, BYTE* b);
STDMETHODIMP Put_RGBColor(BYTE r, BYTE g, BYTE b);
};
ContrastDXSDK\Bin\DXUtils\GraphEdit.exe