Webcam problem directShow9 bitmap panel
Hej eksperter...Jeg får et billede fra webcam på et TPanel via DirectShow9 (virker).
Ønsker at konvertere til bitmap, skjule panelet,
og så vise modificeret bitmap via TImage i stedet.
Kan kopiere billedet over i en bitmap med
bitblt(handle,0,0,width,height,getDc(Panel1.handle),0,0,SRCCOPY);
textOut(5,5,'test....');
end;
tests...
1. Hvis panelets "visible" sættes til False, vises intet i bitmap/timage.
2. Hvis panelet trækkes uden for formens synlige område, vises kun det synlige i bitmap'en.
3. Hvis et TImage placeres inden i panelet (alClient), vises det ikke (panelet vises)
Så.. problemet er altså at jeg ikke kan får bitmap, med mindre panelet er synligt.
Kan nogen hjælpe ?
Har tænkt om man muligvis kunne gå uden om at bruge panelet på en måde, -
om man kan bruge noget andet end panelet, -
eller om man kan få billedet selvom panelet ikke er synligt.
mvh
Morten B. S.
p.s. koden som benyttes
interface
uses
windows,classes,controls,graphics,forms,extCtrls,comObj,activeX, directShow9;
type
TForm1 = class(TForm)
Panel1: TPanel;
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
pGraph :iGraphBuilder;
pBuilder :iCaptureGraphBuilder2;
pDevEnum :iCreateDevEnum;
pClassEnum :iEnumMoniker;
pMoniker :iMoniker;
pSrc :iBaseFilter;
cFetched :pLongInt;
videoWindow :iVideoWindow;
mediaControl :iMediaControl;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
image1.picture.bitmap:=tBitmap.create;
with image1.picture.bitmap do begin pixelFormat:=pf24bit;width:=image1.width;height:=image1.height end;
//--
pGraph:=createComObject(CLSID_FilterGraph) as iGraphBuilder;
pBuilder:=createComObject(CLSID_CaptureGraphBuilder2) as iCaptureGraphBuilder2;
pBuilder.SetFiltergraph(pGraph);
pDevEnum:=createComObject(CLSID_SystemDeviceEnum) as iCreateDevEnum;
pDevEnum.createClassEnumerator(CLSID_VideoInputDeviceCategory,pClassEnum,0);
if pClassEnum.next(1,pMoniker,cFetched)=S_OK then
pMoniker.bindToObject(nil,nil,IID_IBaseFilter,pSrc);
pGraph.addFilter(pSrc,'Video Capture');
pGraph.queryInterface(IID_IMediaControl,mediaControl);
pGraph.queryInterface(IID_IVideoWindow,videoWindow);
pBuilder.renderStream(@PIN_CATEGORY_PREVIEW,@MEDIATYPE_VIDEO,pSrc,nil,nil);
videoWindow.put_windowStyle(WS_CHILD or WS_CLIPSIBLINGS);
videoWindow.setWindowPosition(0,0,panel1.width,panel1.height);
videoWindow.put_owner(panel1.handle);
mediaControl.run;
timer1.interval:=250;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with image1.picture.bitmap,canvas do begin
bitblt(handle,0,0,width,height,getDc(Panel1.handle),0,0,SRCCOPY);
textOut(5,5,'test....');
end;image1.refresh
end;
end.