![]() |
Webcam Bild (JPG) per FTP-Uploaden
Hallo allezusammen!
Ich habe mir den Script von Ultimator mal als Basis Programm "genommen":
Delphi-Quellcode:
und nun bekomme ich das aktuelle Bild in Panel1 angezeigt, nur wie kann ich jetzt das ganze als JPG speichern und dann per FTP uploaden? (ich denke mal mit idFTP (habe ich schonmal getestet, geht gut))
//Zuerst brauchst du folgende Konstanten
const WM_CAP_DRIVER_CONNECT = WM_USER + 10; WM_CAP_EDIT_COPY = WM_USER + 30; WM_CAP_SET_PREVIEW = WM_USER + 50; WM_CAP_SET_OVERLAY = WM_USER + 51; WM_CAP_SET_PREVIEWRATE = WM_USER + 52; implementation {$R *.dfm} //Dann brauchst du noch das hier function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TForm1.LaberLaber; //halt irgendne Prozedur, ich habs im Formcreate, damit ich gleich was seh ^^ var handle:THandle; begin handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 320, 240, Panel1.Handle, 1); //Wie du siehst, brauchst du ein Panel in diesem Beispiel ;-) SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 30, 0); sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); SendMessage(handle, wm_cap_set_preview, 1, 0); end; Das ganze sollte dann auch automatisch alle 2-5 sec geschehen (möchte ich per Timer machen). Nun wie bekomme ich das hin? Wenn jemand schon ein SourceCode für so etwas hat und ihn mir zum "spielen" gibt, wäre ich sehr dankbar! Gruß i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
klingt ganz danach, als ob du andere ausspionieren moechtest.
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Naja, eigentlich ist die Sache recht einfach:
- Als erstes brauchst du das Bild vom Panel in eine "Bild-Variable" (z.B. ein TBitmap). Das erreichst du zum Beispiel mit der ![]() - Dann konvertierst du das Bitmap in ein JPEG. Das geht imho via
Delphi-Quellcode:
.
JpegImage.Assign(Bitmap)
- Danach speicherst du das Bild als Datei. - Und dann lädst du sie hoch. (wie du es scheinbar schon gemacht hast) Fertig. Noch Fragen? :D |
Re: Webcam Bild (JPG) per FTP-Uploaden
Zitat:
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Zitat:
chaosben, funktioniert das auch mit video-overlays? |
Re: Webcam Bild (JPG) per FTP-Uploaden
ich habe einen PC mit einer Webcam, die zur Straße guckt im Keller stehen, und ich würde mal gern versuchen das jpg von der schule über einen Server zu erreichen (fast live versteht sich).
Ich vestehe nicht ganz, wie ich das Bild zum jpg bringe. So?:
Delphi-Quellcode:
Gruß i-n
var
bild : TBitmap; //? oder String? begin bild := handle JpegImage.Assign(bild); end; |
Re: Webcam Bild (JPG) per FTP-Uploaden
Delphi-Quellcode:
natuerlich musst du das dann noch abspeichern (j.savetofile()) und das j objekt wieder freigeben (j.free)
uses jpeg;
.. var j: tjpegimage; begin j := tjpegimage.create; j.assign(deine TBitmap quelle); |
Re: Webcam Bild (JPG) per FTP-Uploaden
Morgen.
Eine möglichkeit das Bild von dem Panel in ein Bitmap zu bekommen ist über die Zwischenablage, wobei VHandle dein Video-Handle ist.
Delphi-Quellcode:
SendMessage(Vhandle, WM_CAP_EDIT_COPY, 1, 0 );
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); |
Re: Webcam Bild (JPG) per FTP-Uploaden
gut!
ich habe noch
Delphi-Quellcode:
in uses geschrieben, dann gings, bis auf, dass nur ein schwarzes Bild gespeichert wird, da Image1 kein Bild bekommt.
Clipbrd
Delphi-Quellcode:
Gruß i-n
SendMessage(handle, WM_CAP_EDIT_COPY, 1, 0 ); //Läd Bild in das Clipboard, oder?
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); // Soll das nicht das Bild in Image1 laden? |
Re: Webcam Bild (JPG) per FTP-Uploaden
Moment, ich habe BD2006 einmal neugestartet, jetzt geht's! (also noch ^^)
Vielen Danke für eure Hilfe! Ich werde mich mal jetzt mit dem Upload beschäftigen, wenn ich etwas nicht versteh, melde ich mich... Gruß i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
Problem:
Es werden nur 9 Bilder gemacht, danach hört "es" einfach auf. Woran kann das liegen? Muss ich jpegimage clearn? |
Re: Webcam Bild (JPG) per FTP-Uploaden
Bitte irgend jemand muss das doch wissen! Bitte, ihr habt mir schon soviel geholfen: Ihr wisst es, ich nicht :(
-i-n- |
Re: Webcam Bild (JPG) per FTP-Uploaden
Setz einfach mal einen Breakpoint(F5) in der Prozedur und lass die Anwendung laufen. Dann siehst du was passiert.
Wird die Prozedur vielleicht nicht mehr aufgerufen? Oder stimmt ein Bedingung nicht? |
Re: Webcam Bild (JPG) per FTP-Uploaden
Kann es auch daran liegen, dass Timer1, und somit das capturen und saven der bilder, zu schnell hintereinander aufgerufen werden? (3sec delay).
edit: wäre es nicht besser, das ganze so aufubauen:?
Delphi-Quellcode:
Was ich damit erreichen möchte ist klar: Es soll immer erst alles abgearbeitet werden, und nicht im Sekundentakt aufgerufen werden, da ich mir nicht sicher bin, ob Timer1 nicht schon neuaufruft, bevor die Schritte abgearbeitet sind. Ist das wirklich so?var x:integer = 0; y:integer = 0; begin while x=y do begin ... //x,y sind immer 0, bis ich die Prozedur beenden will. end; end; Gruß i-n ADD(11:23): Ich habe es mit der nie endenen While-Schleife versucht, Ergebnis: "Nicht genügend Speicher" wird mir "vorgeworfen" (Hab 1gb Ram) Woran liegts? Hätte vielleicht jemand Lust und Zeit mir das per ICQ/MSN zu erklähren? |
Re: Webcam Bild (JPG) per FTP-Uploaden
Ich denke, ich weiss woran es liegen könnte:
Delphi-Quellcode:
SendMessage(handle, WM_CAP_DRIVER_CONNECT, 0, 0); //verbinden: das wir bei jedem Aufruf vom Timer (1sec) mit aufgerufen
begin
handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 640, 480, Panel1.Handle, 1);
Delphi-Quellcode:
Es könnte doch sein, wenn er sich zuoft Connected hat, dass er dann damit aufhört und dann auch den Rest (Bild in Image1 zeigen) nicht mehr ausführt.SendMessage(handle, WM_CAP_SET_PREVIEWRATE, 30, 0); //setRate sendMessage(handle, WM_CAP_SET_OVERLAY, 1, 0); //setOvl SendMessage(handle, wm_cap_set_preview, 1, 0); //prev SendMessage(handle, WM_CAP_EDIT_COPY, 1, 0 );//save Bitmap -> Clipboard Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); //Clipboard (Bitmap) -> Image1 //... end; Meine Frage: Wie kann ich das "Rote" nur einmal ausführen? |
Re: Webcam Bild (JPG) per FTP-Uploaden
:shock:
Du initialisierst die Kamera jedesmal neu... Ruf die Prozedur dafür nur einmal auf, in den Speicher-Timer kommt dann nur das für das Speichern. Und das Konstrukt mit x=y ist sinnlos! was du aber machen solltest ist, am Anfang des Timers diesen .enabled auf false und am ende wieder auf true zu setzen. |
Re: Webcam Bild (JPG) per FTP-Uploaden
jep so habe ich das auchschon ausprobiert: In Form1.Create das Connecten zu Cam; und dann das saven in Timer, aber wenn ich das so versuche, dann hat er immer Probleme mir der var handle:THandle.
|
Re: Webcam Bild (JPG) per FTP-Uploaden
das handle musst du (form-)global deklarieren.
|
Re: Webcam Bild (JPG) per FTP-Uploaden
ich habe es hier deklariert:
Delphi-Quellcode:
Aber es kommt immer wieder dieser Fehler:
//...
public { Public declarations } end; var Form1: TForm1; handle:Thandle; const //... Zitat:
Delphi-Quellcode:
handle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0,0, 640, 480, Panel1.Handle, 1);
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Jop, du kommst hier in konflikt mit TForm1.Handle. Nenn deine Variable lieber "CamHandle".
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Danke!
Jetzt geht alles soweit gut, bis dann der Moment kommt: "Für diesen Befehl ist nicht genügend Speicher verfügbar!" Was ist das jetzt? Clipboard voll? |
Re: Webcam Bild (JPG) per FTP-Uploaden
zeig mal deinen ganzen code soweit bitte.
|
Re: Webcam Bild (JPG) per FTP-Uploaden
nun gut hier mein code:
Delphi-Quellcode:
Ich hoffe Ihr/Du findet/findest den Fehler :bounce1:
//(...)
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, jpeg, clipbrd, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdFTP, StdCtrls; type TForm1 = class(TForm) Panel1: TPanel; Timer1: TTimer; Image1: TImage; IdFTP1: TIdFTP; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Camhandle:Thandle; const WM_CAP_DRIVER_CONNECT = WM_USER + 10; WM_CAP_EDIT_COPY = WM_USER + 30; WM_CAP_SET_PREVIEW = WM_USER + 50; WM_CAP_SET_OVERLAY = WM_USER + 51; WM_CAP_SET_PREVIEWRATE = WM_USER + 52; implementation {$R *.dfm} function capCreateCaptureWindow(lpszWindowName: LPCSTR; dwStyle: DWORD; x, y, nWidth, nHeight: integer; hwndParent: HWND; nID: integer): HWND; stdcall; external 'AVICAP32.DLL' name 'capCreateCaptureWindowA'; procedure TForm1.Button1Click(Sender: TObject); //exit Button begin (* idFTP1.Disconnect; idFTP1.Quit; Deaktiviert, da ich es momentan nicht brauche *) Application.Terminate; end; procedure TForm1.FormCreate(Sender: TObject); begin Camhandle := capCreateCaptureWindow('Video',ws_child+ws_visible, 0, 0, 640, 480, Panel1.Handle, 1); //wird einmalig aufgerufen SendMessage(Camhandle, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(Camhandle, WM_CAP_SET_PREVIEWRATE, 30, 0); Timer1.Enabled := TRUE; // Timer einschalten, für Bilder "machen" end; procedure TForm1.Timer1Timer(Sender: TObject); var j: tjpegimage; //Size: DWORD; wird Momentan nich gebraucht //Result : String; wird Momentan nich gebraucht begin sendMessage(camhandle, WM_CAP_SET_OVERLAY, 1, 0); //| SendMessage(camhandle, wm_cap_set_preview, 1, 0); //|-> Init and make clipboard = bild SendMessage(camhandle, WM_CAP_EDIT_COPY, 1, 0 ); //\ Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);//| j := tjpegimage.create; j.assign(Image1.Picture.Bitmap); //save j.SaveToFile('cap.jpg'); (* ... Hier steht alles zum FTP-Upload, ist aber momentan noch deaktiviert ... *) end; end. |
Re: Webcam Bild (JPG) per FTP-Uploaden
Was macht das SendMessage Set Overlay/Set preview im Timer?
|
Re: Webcam Bild (JPG) per FTP-Uploaden
hmm ich weiss auchnicht wie sich das dorthin kopieren konnte :angel: ...naja ich wusste es nicht besser :angel2:
...habe es jetzt verschoben, aber Fehler kommt immernoch :( Zitat:
gn8 soweit i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
Was kann das sein, wovon zu wenig da ist? - Bitte ich möchte dieses Programm wendlich fertig bekommen :)
Selbst Kleinigkeiten helfen! Wie zum Bleistift handle => Camhandle Bitte! mfg i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
zeig jetzt npochmal deine timerfunktion und sag uns, in welcher zeile der Fehler auftritt
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Hallo :-D ,
also der Fehler gibt nicht an in welcher Zeile er passiert (bzw siehe unten im Code). Hier nochmal der Code des Timers :arrow:
Delphi-Quellcode:
Ich habe noch die "var" Result (=Pc name) reingepackt, da wenn ich es von meinem Pc ausführe, nicht immer die Bilder überschrieben werden; oder ein Konflickt mit dem Pc im Keller auftritt.procedure TForm1.Timer1Timer(Sender: TObject); var j: tjpegimage; Size: DWORD; Result : String; begin SendMessage(camhandle, WM_CAP_EDIT_COPY, 1, 0 ); // make clipboard = bild Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); //img1 = Bild Size := MAX_COMPUTERNAME_LENGTH + 1; SetLength(Result, Size); //PC name holen if GetComputerName(PChar(Result), Size) then SetLength(Result, Size) else Result := ''; j := tjpegimage.create; j.assign(Image1.Picture.Bitmap); //save (Result = Pc name) j.SaveToFile('cap_' + Result + '_.jpg'); (* idFTP1 := TidFtp.Create; idFTP1.Host := '****'; idFTP1.Username := '****'; idFTP1.Password := '****'; idFTP1.Connect; idFTP1.ChangeDir('/test/'); idFTP1.Put('cap_' + Result + '_.jpg'); //upload (Result = Pc name) idFTP1.Disconnect; //idFTP1.Quit; *) end; // wenn ich auf "break" in Delphi klicke, wenn der Fehler kommt, wird diese Zeile makiert. (Violett) So dann erstmal DANKE an alle die mich schon soweit gebracht haben! @inherited: ich hoffe du siehst das Problem :) Gruß i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
hab den Fehler gefunden:
Delphi-Quellcode:
:wall: :wall: war eigentlich klar!!!
j.Free;
...Aber ich habe bestimmt noch Probleme :D Bis dann i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
kommt der fehler bereits beim ersten durchlauf? wenn ja, setz einen breakpoint auf die erste zeile des codes und geh mit F7 Ziele für Zeile weiter durch, dann siehst du genau in welcher Zeile das problem auftritt.
Roter Kasten: Na dann, viel glück weiterhin. |
Re: Webcam Bild (JPG) per FTP-Uploaden
Nein, erst nach einigen Aufrufen... bzw. jetzt garnicht mehr... (s.o.)
Aber wenn ich jetzt auf dem Server Netrender (Cinema 4D) (Maximiert) öffne, dann macht das Programm keine Bilder mehr :( wie kann ich das ändern? |
Re: Webcam Bild (JPG) per FTP-Uploaden
Es soll doch nur IMMER active sein... Bitteeeee
|
Re: Webcam Bild (JPG) per FTP-Uploaden
bitte!! ich brauche nur den code, damit das Programm auch bei maximierten Fenstern, wenn es nicht im Vordergrund ist, weiterläuft. BITTE!
mfg |
Re: Webcam Bild (JPG) per FTP-Uploaden
Hallo mal wieder ;) Ich denke schon ich führe Selbstgespräche hier :D
Bei der Methode, wie ich das Bitmap (JPG) jetzt in Image1.Picture.Bitmap bekomme ist ja leider immer die Zwischenablage nicht zu verwenden. Kann ich das Bild irgendwie mit einem Stream "transportieren"? Hier mal der entscheidende Code
Delphi-Quellcode:
ich hoffe ihr wisst, was ich meine...
SendMessage(camhandle, WM_CAP_EDIT_COPY, 1, 0 ); //Bild in Zwischenablage legen
Image1.Picture.Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0); //Bild aus Zwischenablage holen und in Image1 "packen" mfg i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
Niemand 'ne Ahnung von Bitmap.Streams?
Ach kommt bitte! |
Re: Webcam Bild (JPG) per FTP-Uploaden
Lass den Leuten doch auch mal Zeit. Alle 24 Stunden zu pushen reicht locker.
Noch was: Zitat:
Zitat:
|
Re: Webcam Bild (JPG) per FTP-Uploaden
Zitat:
Aber nett, dass du mich draufhinweist! -> Mir kam der Zeitabstand kleiner vor. |
Re: Webcam Bild (JPG) per FTP-Uploaden
Zitat:
SendMessage(ghCapWnd, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0); //weitergrabben wenn Anwendung minimiert oder verdeckt ist
Delphi-Quellcode:
//das im Timer aufrufen ... capSetCallbackOnFrame(ghCapWnd, integer(@FrameCallbackFunction)); ... uses VideoCap, avicap, VideoMci; //grabben über callback fuction function FrameCallbackFunction(AHandle : hWnd; VIDEOHDR : TVideoHDRPtr): bool; stdcall; begin result := true; // da diese Callback-Funktion sonst bei jedem Preview-Frame ganz durchlaufen werden würde: // jetzt nur noch mehr dann, wenn draußen GrabFrameFlag auf TRUE gesetzt wurde PLUS, für die // Hintergrundlaufbarkeit: SendMessage(ghCapWnd, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0); if GrabFrameFlag = false then exit; GrabFrameFlag := false; SendMessage(ghCapWnd, WM_CAP_GRAB_FRAME_NOSTOP, 1, 0); //erzeuge Grundbildmaße with Form1 do begin with camBitmapInfo.bmiHeader do begin bild_anzeige.Width:=biWidth; bild_anzeige.Height:=biHeight; bild_original.Width:=biWidth; bild_original.Height:=biHeight; bild_old.Width:=biWidth; bild_old.Height:=biHeight; bild_anzeige.PixelFormat:=pf24bit; //truecolorBild bild_original.PixelFormat:=pf24bit; //truecolorBild bild_old.PixelFormat:= pf24bit; end; hCompatibleBitmap:=bild_original.Handle; //function sets the bits of color data for a bitmap to the specified values. SetBitmapBits(hCompatibleBitmap,VideoHDR^.dwBufferLength,VideoHDR^.lpData); //return= anzahl bytes //Bild jetzt in bild_original ... end;//form1 GrabFrameFlag := true; end; |
Re: Webcam Bild (JPG) per FTP-Uploaden
danke!
Ich werde mich die Tage mal damit beschäftigen, wenn ich Fragen habe, seit ihr die ersten, die es erfahren ;) Gruß i-n |
Re: Webcam Bild (JPG) per FTP-Uploaden
1. Woher bekomme ich die Componenten für "uses"?
2. Und: Wie kann ich jetzt das Bild (ohne Zwischenspeichern und Clipboard ;)) auf den FTP-Server bekommen? 3. Das Bild ist ja jetzt in "bild_original", oder? aber die (wenn es denn eine ist) Variable "bild_original" ist nirgends definiert. ist sie TJPEG? 4. Und noch meine Letzte Frage: Wenn ich
Delphi-Quellcode:
aufrufe, was bekomme ich dann zurück, "bild_original"? Also direkt das TJPEG?
capSetCallbackOnFrame(ghCapWnd, integer(@FrameCallbackFunction));
Ich weiss es sind viele Fragen, sorry :oops: mfg i-n |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz