首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

自製 DirectShow Transform Filter 實現影片色彩調整

     編輯:關於VC++

動機與工具

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

Filter 效果示意

Filter 三大類型

  1. Source Filter:媒體來源(檔案、網路串流)
  2. Transform Filter:資料處理(本例屬此類)
  3. Render Filter:影音輸出(視窗、聲卡)

Filter 連接流程(核心虛擬函式)

繼承 CTransformFilter,必須實作:

  • CheckInputType:驗證輸入 Pin 支援的媒體型別
  • GetMediaType:提供輸出 Pin 支援的媒體型別
  • CheckTransform:檢查輸入/輸出型別是否相容
  • DecideBufferSize:協商配置器屬性
  • Transform(IMediaSample* in, IMediaSample* out):實際資料處理(複製並修改像素)

關鍵實作細節

1. 自訂介面 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 互動。

2. 色彩調整演算法(參考 SDK Contrast 範例)

void AdjustContrast(BYTE* r, BYTE* g, BYTE* b);
void ChangeContrast(RGBQUAD* pElem); // 對單一像素操作

在 Transform 中將輸入樣本資料複製到輸出樣本,再逐像素呼叫 ChangeContrast 修改 RGB 值。

3. 註冊與測試

  • 編譯產生 PropPage.ax,執行 regsvr32 PropPage.ax 註冊
  • 開啟 GraphEdit → Graph → Insert Filters → DirectShow Filters → Huang RGB Filter
  • File → Render Media File 開啟 .mpg,即可透過屬性頁調整色彩

原始碼結構重點

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);
};

參考資源

  • 陸其明《DirectShow 開發指南》
  • DirectX SDK 範例 Contrast
  • GraphEdit 工具:DXSDK\Bin\DXUtils\GraphEdit.exe
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved