程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 自己寫FILTER改變畫面顏色

自己寫FILTER改變畫面顏色

編輯:關於VC++

directx show 的幫助文檔是一個很好的參考資料。可是裡面的很多東西都講得太多了,而我們在開始接觸的時候,都想從最簡單的東西入手,然後逐漸深入,可是參考SDK裡面的例子程序,總是雲裡霧裡,特別是自己動手寫FILTER,要撥開它的叢叢霧水,還真有些不容易。

陸其明老師的《directx show 開發指南》對directx show 有比較經典的講解,從它發表在網上的文章可以看到一部分。很可惜我這地方太落後了,買不到這本書,我也是一個DS的初學者,我想以後還請大家多多指教。

Directx show 的graphedit 是一個很好的filter調試工具,具體位置在..\DXSDK\Bin\DXUtils目錄下。在: 開始->程序->Microsoft directx9.0 sdk->directx utilities 下也能找到該工具,我寫的這個FILTER ,讀者打開該工具後,在菜單:GRAPH->INSERT FILTER打開"WHICH FILTERS DO YOU WANT TO INSERT "對話框,點擊"directxshow filters->Huang RGB Filter"插入即可,然後從"FILE->RENDER MEDIA FILE "打開一個MPG格式的文件,你就可以播放你的影片了,可以通過Huang RGB Filter 改變畫面的顏色。下面就來說說FILTER的事情。

FILTER的種類有三種:

  • 1. SOURCE FILTER;(如網絡流媒體,本地媒體文件)
  • 2. TRANSFORM FILTER;(對媒體文件改變的部分,本FILTER既是)
  • 3. RENDER FILTER;(視頻顯示)

FILTER的連接:(只關心程序的部分實現,不作完全討論)

  • 1. 輸入PIN的連接:你要將你的FILTER加入到FILTER GRAPH中,首要做的事情就是檢查你的FILTER的輸入PIN上支持的媒體類型。CheckInputType在該FILTER上實現。
  • 2. 輸出PIN的連接: DOWNSTREAM FILTER要連接你的FILTER首先要查看輸出PIN上所支持的媒體類型。調用的函數為GetMediaType,該函數在FILTER實現即可。一旦輸出PIN支持連接的媒體類型,則FILTER會CheckTransform檢查輸入輸出的媒體類型是否滿足要求,CheckTransform 成功後,就會協商ALLOCATOR,具體在DecideBufferSize中完成。就這麼簡單的幾個函數,FILTER就可以連接到FILTER GRAPH 了。
  • 3. 媒體的傳輸:

    本例是基於CTransformFilter 的,所以在傳輸的時候,調用的就是CTransformFIlter::Transform(IMediaSample *pSource,IMediaSample *pDest)函數,我們要做的事情,即是將pSource上的數據拷貝到pDest上即可。如果你只是簡單的傳輸一下,例子中的Copy函數即可滿足要求,要在媒體上作修改,只需在pDest上完成。本例參照了SDK的FILTER中的CONSTRAST這個例子改變顏色,本例有很多不足,它不是用來實現什麼完整功能的,他只是一個簡單的例子程序,讓我們自己操作媒體。很有趣吧。

下面講講程序裡的事情:

  • 1. 通過一個自定義的最簡單的接口IChangeColor完成RGB數值的傳遞,裡面有一點點COM的知識,在COM中接口是靠組件來實現的,本例CColorFilter既是一個傳輸FILTER同時也是一個實現接口IChangeColor的組件。所有IChangeColor的函數的具體實現,都是在CColorFilter裡定義和實現的,因此在CProp中調用IChangColor接口,相關動作是在CColorFilter中完成,是不是很有趣。 //IChangeColor implement
       STDMETHODIMP Get_RGBColor(BYTE *r,BYTE *g,BYTE *b);
       STDMETHODIMP Put_RGBColor(BYTE r,BYTE g,BYTE b);
    完成了這兩個方法。
  • 2. 在CProp中通過IChangColor可以和界面打交道,這部分分開來寫就簡單了。具體請看源代碼。幾個函數是必須的,要理解工作原理,你可以加入測試代碼。
  • 3. CColorFilter是關鍵,這是一個最少的實現了。 HRESULT CheckInputType(const CMediaType *pmtin);
      HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
      HRESULT CheckTransform(const CMediaType *mtin,const CMediaType *mtout);
      HRESULT DecideBufferSize(IMemAllocator *pAlloc,ALLOCATOR_PROPERTIES *pProp);
      HRESULT Transform(IMediaSample *pin,IMediaSample *pout);
    是必須實現的父類CTransformFilter的方法。 void AdjustConstrast(BYTE *r,BYTE *g,BYTE *b);
      HRESULT Transform(AM_MEDIA_TYPE *pDest);
      HRESULT Transform(IMediaSample *pMediaSample);
      HRESULT copy(IMediaSample *pin,IMediaSample *pout);
      void ChangeContrast(RGBQUAD *pElem);
    是自己寫的函數,主要就是用來改變媒體顏色。

要程序注冊,需要你從新編譯一下。出現注冊成功的對話框後,你就可以用graphedit工具用上面介紹的方法操作了。要編譯成功請根據你的實際情況設定include 和lib 的路徑。

你也可以直接用regsvr32 這個文件這冊我提供給你的..\debug\PropPage.ax。程序環境VC6.0+WIN2000+DX9.0;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved