void __fastcall TMainForm::Button1Click(TObject *Sender)
{
Graphics::TBitmap * Pic;
Pic = new Graphics::TBitmap;
SampleGrabber1->GetBitmap(Pic);
Image1->Canvas->Draw(0,0,Pic);
Pic->Free();
}
Не получается сделать скриншот (DSPACK)
Код:
Эта штука замечательно работает, если захват изображения идет из видеофайла, а с вебкамеры нет. Кто нить может знает почему?
Посмотрел в DSPACKовских примерах. Под Дельфи есть программа, которая реализует то, что мне нужно. Но перевести код с дельфи на С++ Билдер не получаетсо.
Вот фрагмент кода, для Дельфи, где мне как кажется и кроется главная причина:
Код:
procedure TVideoForm.OnSelectDevice(sender: TObject);
begin
FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2 do // вот этой штуки у меня нет,
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter); //и поэтому не работает
FilterGraph.Play;
end;
begin
FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2 do // вот этой штуки у меня нет,
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter); //и поэтому не работает
FilterGraph.Play;
end;
На билдере в обработчике того же самого события, у меня пока такой код, и хотелось бы сделать их равнозначными: ;)
Код:
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));
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
Graph->RenderStream(
FilterGraph->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
}
{
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));
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
Graph->RenderStream(
FilterGraph->Play();
Graph->Release();
VideoFilter->Release();
SourceFilter->Release();
}
Код:
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SampleGrabber1));
и изменить функцию RenderStream
Код:
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleGrabber1, VideoFilter);
Ток все равно ничего не работает ;) Результат. Даже при захвате видео, теперь черный экарн ;)
// with FilterGraph as ICaptureGraphBuilder2 do - тут как обычное приведение типа
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#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.FriendlyName;
Device->Tag = i;
Device->OnClick = DevicesClick;
Devices->Add(Device);
}
};
}
//---------------------------------------------------------------------------
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;
// IBaseFilter *SampleGrabber;
CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));
// CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SampleGrabber));
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
// Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleGrabber, VideoFilter);
FilterGraph->Play();
// SampleGrabber->Release();
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)
{
Graphics::TBitmap *Pic = new Graphics::TBitmap;
SampleGrabber->GetBitmap(Pic);
Image1->Canvas->Draw(0, 0, Pic);
}
//---------------------------------------------------------------------------
#include <vcl.h>
#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.FriendlyName;
Device->Tag = i;
Device->OnClick = DevicesClick;
Devices->Add(Device);
}
};
}
//---------------------------------------------------------------------------
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;
// IBaseFilter *SampleGrabber;
CheckDSError(FilterGraph->QueryInterface(IID_ICaptureGraphBuilder2, &Graph));
CheckDSError(VideoWindow->QueryInterface(IID_IBaseFilter, &VideoFilter));
CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SourceFilter));
// CheckDSError(Filter->QueryInterface(IID_IBaseFilter, &SampleGrabber));
Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, NULL, VideoFilter);
// Graph->RenderStream(&PIN_CATEGORY_PREVIEW, NULL, SourceFilter, SampleGrabber, VideoFilter);
FilterGraph->Play();
// SampleGrabber->Release();
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)
{
Graphics::TBitmap *Pic = new Graphics::TBitmap;
SampleGrabber->GetBitmap(Pic);
Image1->Canvas->Draw(0, 0, Pic);
}
//---------------------------------------------------------------------------
Цитата: Zor
вместо того чтобы скулить надо было проект выкладывать. иначе о чем говорить?
приведение типа
приведение типа
Сильно сказано, правда думается, что если кода будет много (проэкт) - врядли кто то читать это вообще будет. Кстати скулить - это относится к собакам, но не к людям.
// могут, еще как
Уважаемый Зор, или как вас там. Предлагаю прекратить ОФФТОП!!! В первом сообщении было написано все что на мой взгляд нужно для ответа на мой вопрос(или, как модно говорить сейчас, на мой ответ). Если вам этих данных не хватило, можно было написать что то на подобие "код в студию". Предлагаю эти обсуждение закрыть, и далее отписываться тока по существу.
кстати, это утверждение:
Цитата: Zor
// with FilterGraph as ICaptureGraphBuilder2 do - тут как обычное приведение типа
не верно
2 seska - не отвечаем (не-по-делу), а жмем кнопку - "Позвать модератора"
Дальше только по сути вопроса.
На первый раз обоим устное внушение.
2all: ok // и тема плавно уезжает в архивы...