關於DSPack (DirectShow)如何解析度提高 跟影像複製到Image上(限制在320*240) 測試結果問題*以解決了* |
尚未結案
|
foxwinenr
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-23 發送簡訊給我 |
第一次 發問 還請多多包涵
以下是研究幾天的結果 從安裝到範例成果 還是不懂 如何使用DSPack(DirectShow) 此範例是: 1.可以調解析度 2.可以複製到Image Image 複製限制 問題: 我要把攝影機解析度固定在1280*960 並且可以複製在Image上 請問我要如何修改此程式範例 在此感謝各位先進的協助 [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "DSPack" #pragma resource "*.dfm" TMainForm *MainForm; TSysDevEnum *SysDev; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormCreate(TObject *Sender) { /* SysDev = new TSysDevEnum(CLSID_VideoInputDeviceCategory); if (SysDev->CountFilters > 0) { int i; TMenuItem *Device; for(i = 0; i < SysDev->CountFilters; i ) { Device = new TMenuItem(Devices); Device->Caption = SysDev->Filters[i].FriendlyName; Device->Tag = i; Device->OnClick = DevicesClick; Devices->Add(Device); } };*/ SysDev = new TSysDevEnum(CLSID_VideoInputDeviceCategory); if (SysDev->CountFilters > 0) { int i,j; TMenuItem *Device; TMenuItem *SubItem; IBaseFilter *SourceFilter = NULL; for(i = 0; i < SysDev->CountFilters; i ) {Device = new TMenuItem(Devices); Device->Caption = SysDev->Filters[i].FriendlyName; Device->Tag = i; //Device->OnClick = DevicesClick; Devices->Add(Device); //FilterGraph->ClearGraph(); FilterGraph->Active = false; Filter->BaseFilter->Moniker = SysDev->GetMoniker(i); FilterGraph->Active = true; CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter)); TPinList *PinList=new TPinList(SourceFilter); TEnumMediaType *VideoMediaTypes=new TEnumMediaType(PinList->First()); char buffer[1024]; for(j=0 ; j<VideoMediaTypes->Count ; j ) {SubItem=new TMenuItem(Devices); sprintf(buffer,"%s",VideoMediaTypes->MediaDescription[j]); //MediaDescription內容如下 //Major Type:Video . Sub Type: RGB24 Format: Videoinfo RGB 320X240,24 bits //從第58個字元當作item的標題 ^^^^^^^^^^^^^^^ /*要得到個別的資訊可使用下列的程式碼 VIDEOINFOHEADER *pVih; long Width,Height,BitCount; pVih=(VIDEOINFOHEADER*)VideoMediaTypes->Items[j]->Format(); BitCount=pVih->bmiHeader.biBitCount;//24 bits Width = pVih->bmiHeader.biWidth; //320 Height = pVih->bmiHeader.biHeight; //240 */ SubItem->Caption = buffer 58; SubItem->Tag = j; SubItem->OnClick = DevicesClick; Device->Add(SubItem); } delete PinList; delete VideoMediaTypes; } FilterGraph->ClearGraph(); FilterGraph->Active = false; }; this->DoubleBuffered=true; } //--------------------------------------------------------------------------- void __fastcall TMainForm::DevicesClick(TObject *Sender) { FilterGraph->ClearGraph(); FilterGraph->Active = false; Filter->BaseFilter->Moniker = SysDev->GetMoniker(((TMenuItem *)Sender)->Tag); FilterGraph->Active = true; ICaptureGraphBuilder2 *Graph = NULL; IBaseFilter *SourceFilter = NULL; IBaseFilter *VideoFilter = NULL; CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph)); CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter)); CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter)); IBaseFilter *SampleFilter=NULL; CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter,&SampleFilter)); //Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter); Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleFilter, VideoFilter); FilterGraph->Play(); Graph->Release(); VideoFilter->Release(); SourceFilter->Release(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormDestroy(TObject *Sender) { delete SysDev; } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose) { FilterGraph->Active = false; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Button1Click(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::SampleGrabber1Buffer(TObject *sender, double SampleTime, Pointer pBuffer, int BufferLen) { SampleGrabber1->GetBitmap(Image1->Picture->Bitmap, pBuffer, BufferLen); } //--------------------------------------------------------------------------- void __fastcall TMainForm::Button2Click(TObject *Sender) { IsCapure=true; } //--------------------------------------------------------------------------- [/code] |
foxwinenr
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-23 發送簡訊給我 |
|
foxwinenr
一般會員 發表:1 回覆:2 積分:0 註冊:2009-03-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |