如何使用DirectShow實現Zoom in/out? |
缺席
|
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
想請教各位前輩, 我現在有一台羅技的webcam,我只灌他的驅動程式,不灌他的應用程式 也就是說我不能用他的應用程式去調整焦距、亮度以及相關參數 那該怎麼應用DirectShow去實現 Zoom in/out 呢? 麻煩各位前輩了,感謝~ 附上我目前的程式進度:(能選擇webcam的解析度,並且能擷取靜態影像) [code cpp] void __fastcall TMainFm::CameraStart() { //Application->ProcessMessages(); //check... FilterGraph->ClearGraph(); FilterGraph->Active = false; Filter->BaseFilter->Moniker = SysDev->GetMoniker(0); FilterGraph->Active = true; ICaptureGraphBuilder2 *Graph = NULL; //Graph 宣告 IBaseFilter *SourceFilter = NULL; //soucefilter 宣告 IBaseFilter *VideoFilter = NULL; //VideoFilter 宣告 CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph)); CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter)); CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter)); //改變解析度的程式碼--------------- TPinList *PinList=new TPinList(SourceFilter); TEnumMediaType *VideoMediaTypes=new TEnumMediaType(PinList->First()); IAMStreamConfig *iconfig = NULL; CheckDSError(PinList->First()->QueryInterface(IID_IAMStreamConfig,(void **)&iconfig)); //int index=ComboBox2->ItemIndex; //VideoMediaTypes->Items[解析度號碼] iconfig->SetFormat(VideoMediaTypes->Items[webcam_idx]->AMMediaType); //logitech QuickCam Orbit AF //編號19:1280x1024 24bit //編號22:1600x1200 24bit delete PinList; delete VideoMediaTypes; //---------------------------------- //擷取Stream的程式碼--------------- IBaseFilter *SampleFilter=NULL; CheckDSError(SampleGrabber1->QueryInterface(IID_IBaseFilter,&SampleFilter)); //---------------------------------- Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleFilter, VideoFilter); //Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter); FilterGraph->Play(); Graph->Release(); VideoFilter->Release(); SourceFilter->Release(); SampleFilter->Release(); } //--------------------------------------------------------------------------- void __fastcall TMainFm::SampleGrabber1Buffer(TObject *sender, double SampleTime, Pointer pBuffer, int BufferLen) { Application->ProcessMessages(); Image[0]->Canvas->Lock(); SampleGrabber1->GetBitmap(Image[0]->Picture->Bitmap, pBuffer, BufferLen); Buffer->Assign(Image[0]->Picture->Bitmap); //預覽時的框框 Image[0]->Canvas->Pen->Color=clLime; Image[0]->Canvas->Pen->Width=15; //Image[0]->Canvas->Pen->Mode=pmNotXor; Image[0]->Canvas->Brush->Style=bsClear; Image[0]->Canvas->Rectangle(150,200,1110,1000); //1.2的比例 if(IsCapture) { Buffer->SaveToFile(ExtractFilePath(Application->ExeName) "Capture" IntToStr(ShotCount) ".bmp"); //抓圖 IsCapture=false; } Image[0]->Canvas->Unlock(); } //--------------------------------------------------------------------------- [/code] |
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
|
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
|
sandyl39
一般會員 發表:0 回覆:12 積分:17 註冊:2003-02-26 發送簡訊給我 |
|
sunwingman
一般會員 發表:26 回覆:47 積分:14 註冊:2008-05-14 發送簡訊給我 |
Hello,感謝您回覆 其實我後來是直接在Buffer裡面作影像的處理,來達到zoom in/out的效果 以下是我程式碼的片段,跟你分享 void __fastcall TForm1::SampleGrabber1Buffer(TObject *sender, double SampleTime, Pointer pBuffer, int BufferLen) { Application->ProcessMessages(); CaptureImage->Canvas->Lock(); SampleGrabber1->GetBitmap(CaptureImage->Picture->Bitmap, pBuffer, BufferLen); GlobalBmp->Assign(CaptureImage->Picture->Bitmap); Image1->Picture->Bitmap->Assign(CaptureImage->Picture->Bitmap); Graphics::TBitmap *Temp = new Graphics::TBitmap(); Temp->Width =ImgW-Scale*2; Temp->Height =(ImgW-Scale*2)*Rate; Temp->PixelFormat=pf24bit; int bias=Scale*Rate; Byte *ptr=NULL; Byte *gptr=NULL; for(int y=bias;y { ptr = (Byte*)Image1->Picture->Bitmap->ScanLine[y]; gptr = (Byte*)Temp->ScanLine[y-bias]; for(int x=Scale; x
{ gptr[(x-Scale)*3] = ptr[x*3]; gptr[(x-Scale)*3 1] = ptr[x*3 1]; gptr[(x-Scale)*3 2] = ptr[x*3 2]; } } Image1->Stretch=true; Image1->Picture->Bitmap->Assign(Temp); delete Temp; Temp=NULL; CaptureImage->Canvas->Unlock(); } void __fastcall TForm1::ScrollBar1Change(TObject *Sender) { int pos,pos_t,t1,t2; pos = ScrollBar1->Position; pos_t = pos*20; t1 = pos_t*2; t2 = ImgW-100; if(t1
Scale=pos_t; else ScrollBar1->Position = pos-1; }
編輯記錄
sunwingman 重新編輯於 2012-02-08 19:51:18, 註解 無‧
sunwingman 重新編輯於 2012-02-08 19:52:30, 註解 無‧ sunwingman 重新編輯於 2012-02-08 19:53:13, 註解 無‧ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |