Accueil > > > ENVOI ET RÉCEPTION D'UNE CAPTURE D'ÉCRAN PAR STREAMS AVEC LES COMPOSANTS TCP INDY
ENVOI ET RÉCEPTION D'UNE CAPTURE D'ÉCRAN PAR STREAMS AVEC LES COMPOSANTS TCP INDY
Information sur la source
Description
Je dispose de Delphi 7 et je voulais créer une application capable d'envoyer une capture de mon écran à un ordinateur distant. Après avoir chercher un peu parmi les sources disponibles et après avoir tester quelques un, je n'ai pas trouver de solution convenant à mes besoins. Il y'a bien une source qui présente comment faire une application du style VNC mais il n'est pas précisé k'il faut pour pouvoir compiler ce code disposer de composants fastnet qui ont malheureusement disparus de la palette Delphi 7. Je propose donc ici un moyen très simple d'envoyer une capture d'écran par streaming à l'aide des composants Indy (fournis avec Delphi 7). Le principe est simple, le logiciel client crée une capture d'écran, la converti en jpg, l'enregistre dans un stream et l'envois par TCP. De son côté le logiciel serveur réceptionne le stream et le charge dans un coposant Timage. Le code présente juste la maniere d'envoyer et recevoir le stream, libre a vous de vous en servir comme bon vous semble, il est tt à fait possible de se servir du code dans l'autre sens, c'est à dire d'envoyer le stream depuis le serveur jusqu'au client après que le serveur ait recu une requette lui demandant d'envoyer l'image (moyennant peu être quelques modifications pas insurmontables même pour débutant). Le programme client se présente de cette maniere : c'est une form avec 2 boutons, un pour démarrer l'envois et l'autre pour l'arreter. Il y'a aussi 2 edits, un où l'on doit mettre l'ip du serveur distant et l'autre où l'on indique l'intreval des envois de capture d'écran "en ms" (la valeure de l'intreval de répétion du timer). dans le cas de l'envois du stream depuis le serveur jusqu'au client après la réception d'une requette il est plus commode de ne pas utiliser de timer, simplement d'envoyer une nouvelle requette pour une capture lors de la réception de la précédente. Attention ce deuxieme cas n'est pas abordé ici car ce n'est pas de cette fonction que j'avais besoin mais je la posterai sans doute en complément plus tard. Sinon le logiciel serveur contient un composant tcp server Indy et un composant Timage, c'est tout. Je sais je parle trop mais que voulez vous, on se refait pas ;)
Source
- // Sources du client :
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
- IdTCPClient,jpeg, ExtCtrls; //Ne pas oublier de déclarer la classe jpeg
-
- type
- TForm1 = class(TForm)
- tcp: TIdTCPClient; //Composant tcp client de Indy
- Button1: TButton;
- Edit1: TEdit;
- Timer1: TTimer;
- Button2: TButton;
- Label1: TLabel;
- Edit2: TEdit;
- Label2: TLabel;
- procedure Button1Click(Sender: TObject);
- procedure sendstr;
- procedure Timer1Timer(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
-
- procedure TForm1.sendstr; //Procedure de capture d'écran,conversion en jpg et envoi
- var Img:TPicture;
- MemStream:TMemoryStream; // Déclaration des variables
- JPG:TJPEGImage;
- Bmp :TBitMap;
- Rect:TRect;
-
- begin
-
- Img:=TPicture.Create;
- Bmp := TBitMap .Create; //Initialisation des variables qui doivent l'être
- MemStream:=TMemoryStream.Create;
-
- Img.Bitmap.Width:=Screen.Width;
- Img.Bitmap.Height:=Screen.Height;
- BitBlt(Img.Bitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,GetDC(GetDesktopWindow),0,0,SrcCopy); //Capture de l'écran
- JPG:=TJPEGImage.Create;
- try
- JPG.Assign(Img.Bitmap); //Conversion en jpg
- JPG.CompressionQuality:=15;
- Bmp.Width :=Jpg.Width -50;
- Bmp.Height :=Jpg.Height -50;
- Rect.Left :=0;
- Rect.Top :=0;
- Rect.Right :=Bmp.Width-1;
- Rect.Bottom:=Bmp.Height-1;
- Bmp.Canvas.StretchDraw(Rect,Jpg);
- Jpg.Assign(Bmp);
- jpg.savetostream(Memstream);//Chargement de l'image jpg dans le stream
- finally
- bmp.Free;
- img.free;
- JPG.Free;
- try
- with tcp do
- begin
-
- OpenWriteBuffer;
- WriteStream(memstream);//Envoi du stream
- CloseWriteBuffer;
- memstream.Free;
- disconnect; //Déconnexion
- end;
- except
-
- end;
- end;
- end;
-
- procedure TForm1.Button1Click(Sender: TObject); //Bouton pour démarrer l'envoi
- begin
- try
- timer1.Interval:= strtoint(edit2.Text);//Définition de l'interval du timer
- tcp.Host:= edit1.Text; //Définition de l'hote (serveur)
- timer1.Enabled:=true; //Démarrage du timer
- except
- end;
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject); //Procedure que le timer execute celon l //'interval donné
- begin
- try
- tcp.Connect; //Connexion du client tcp
- form1.sendstr; //Execution de la procédure définie plus haut
- except
- timer1.Enabled:= false; //Si la connexion est impossible on arrete le timer
- showmessage('connextion impossible'); //On affiche une boite de dialogue qui nous informe
-
- end;
-
- end;
-
- procedure TForm1.Button2Click(Sender: TObject); //Bouton qui arrete l'envoi
- begin
- timer1.Enabled:= false; //On arrete tout simplement le timer
- end;
-
- end.
-
-
-
-
-
- //Sources du serveur
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls,jpeg; //Pas oublier jpeg
-
- type
- TForm1 = class(TForm)
- tcp: TIdTCPServer;//Composant serveur TCP Indy
- Image1: TImage;
- procedure tcpExecute(AThread: TIdPeerThread);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.tcpExecute(AThread: TIdPeerThread); //procedure appellée lors de la
- var stream : tmemorystream; //réception des données
- jpg : tjpegimage; //Définition des variables
- begin
-
- jpg:= tjpegimage.Create; //Initialisation de jpg et stream
- stream:= tmemorystream.Create;
- athread.Connection.ReadStream(stream, -1, true); //réception du stream du début à la fin
- Stream.Seek(0, soFromBeginning); //On reset la position du pointer pour la lecture
- // Peut être remplacer par stream.position:=0;
- jpg.LoadFromStream(stream); //Chargement du stream dans la variable jpg
- image1.Picture.Graphic:= jpg; //Affichage de l'image contenue dans jpg sur le Timage
- stream.free; //Purge de la mémoire du stream
-
-
- end;
-
- end.
// Sources du client :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient,jpeg, ExtCtrls; //Ne pas oublier de déclarer la classe jpeg
type
TForm1 = class(TForm)
tcp: TIdTCPClient; //Composant tcp client de Indy
Button1: TButton;
Edit1: TEdit;
Timer1: TTimer;
Button2: TButton;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure sendstr;
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.sendstr; //Procedure de capture d'écran,conversion en jpg et envoi
var Img:TPicture;
MemStream:TMemoryStream; // Déclaration des variables
JPG:TJPEGImage;
Bmp :TBitMap;
Rect:TRect;
begin
Img:=TPicture.Create;
Bmp := TBitMap .Create; //Initialisation des variables qui doivent l'être
MemStream:=TMemoryStream.Create;
Img.Bitmap.Width:=Screen.Width;
Img.Bitmap.Height:=Screen.Height;
BitBlt(Img.Bitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,GetDC(GetDesktopWindow),0,0,SrcCopy); //Capture de l'écran
JPG:=TJPEGImage.Create;
try
JPG.Assign(Img.Bitmap); //Conversion en jpg
JPG.CompressionQuality:=15;
Bmp.Width :=Jpg.Width -50;
Bmp.Height :=Jpg.Height -50;
Rect.Left :=0;
Rect.Top :=0;
Rect.Right :=Bmp.Width-1;
Rect.Bottom:=Bmp.Height-1;
Bmp.Canvas.StretchDraw(Rect,Jpg);
Jpg.Assign(Bmp);
jpg.savetostream(Memstream);//Chargement de l'image jpg dans le stream
finally
bmp.Free;
img.free;
JPG.Free;
try
with tcp do
begin
OpenWriteBuffer;
WriteStream(memstream);//Envoi du stream
CloseWriteBuffer;
memstream.Free;
disconnect; //Déconnexion
end;
except
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject); //Bouton pour démarrer l'envoi
begin
try
timer1.Interval:= strtoint(edit2.Text);//Définition de l'interval du timer
tcp.Host:= edit1.Text; //Définition de l'hote (serveur)
timer1.Enabled:=true; //Démarrage du timer
except
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); //Procedure que le timer execute celon l //'interval donné
begin
try
tcp.Connect; //Connexion du client tcp
form1.sendstr; //Execution de la procédure définie plus haut
except
timer1.Enabled:= false; //Si la connexion est impossible on arrete le timer
showmessage('connextion impossible'); //On affiche une boite de dialogue qui nous informe
end;
end;
procedure TForm1.Button2Click(Sender: TObject); //Bouton qui arrete l'envoi
begin
timer1.Enabled:= false; //On arrete tout simplement le timer
end;
end.
//Sources du serveur
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls,jpeg; //Pas oublier jpeg
type
TForm1 = class(TForm)
tcp: TIdTCPServer;//Composant serveur TCP Indy
Image1: TImage;
procedure tcpExecute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.tcpExecute(AThread: TIdPeerThread); //procedure appellée lors de la
var stream : tmemorystream; //réception des données
jpg : tjpegimage; //Définition des variables
begin
jpg:= tjpegimage.Create; //Initialisation de jpg et stream
stream:= tmemorystream.Create;
athread.Connection.ReadStream(stream, -1, true); //réception du stream du début à la fin
Stream.Seek(0, soFromBeginning); //On reset la position du pointer pour la lecture
// Peut être remplacer par stream.position:=0;
jpg.LoadFromStream(stream); //Chargement du stream dans la variable jpg
image1.Picture.Graphic:= jpg; //Affichage de l'image contenue dans jpg sur le Timage
stream.free; //Purge de la mémoire du stream
end;
end.
Conclusion
Voilà, pour précision, le composant serveur doit être activé pour pouvoir recevoir des informations, celà peut être fait de la maniere suivante "nomduserveur.active:=true;". Ce n'est pas apparent dans la source car je l'ai définit comme activé dans l'inspecteur d'objet avant l'execution. De même le port de communication n'est pas apparent dans la source non plus car je lui ai attribué une valeure arbitrairement dans l'inspecteur d'objet également. Si vous avez des commentaire je suis preneur, sauf si c'est pour me dire que le code n'a rien à faire ici parce que c'est trop simple où je ne sais quoi (j'ai observé ca ici). Comme je l'ai précisé j'ai chercher une solution dans les sources proposée et je n'ai pas trouvé de sujet traitant de cette maniere relativement facile le problème. mauvaises langues s'abstenir merci. Les commentaires du codes paraitront surement inutiles et dérisoires pour les programmeurs confirmés mais je suis sure que certains débutants aprécieront. C'est bon je me tais, j'ai fini lol.
Historique
- 04 octobre 2004 20:29:58 :
- Déplacement des commentaires dans la source.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
besoin d'aide TCP indy 10 [ par Nero` ]
Bonsoir à tous et toutes.J'ai un petit soucis avec les composants TCP de indy 10. j'explique:Je réalise un petit client avec le compo idtcpclient. J'e
indy download [ par ced55957 ]
bonjours à tous voila je voudrais recuperer un fichier "test.txt" sur mon serveur ftp avec un indy j'ai écris le bout de programme pour me connecter
Debit download / upload d'une ligne internet [ par maxkweeger ]
bonjour,Pourriez vous m'eguiller sur la creation d'un soft qui pourrer mesurer le debit d'une ligne internet toute les secondes en upload et download
Tcp client indy onWork [ par kschn ]
ben voila en fait le but c de faire un client server tcp avec indy en fait le client envoi un message au server et le server envoi une reponse au clie
indy serveur TCP [ par templeofboom ]
Bonjour je voudrais gérer des exception sur mon serveur TCP indy , en particulier celle qui indique "dépassement de thread de terminaison" l
Probleme de stream [ par ewertheimer ]
Voila en faites je suis en train de creer un logiciel ou on charge des image dans un TImage et l'on envoie ensuite la photo par stream. Mon probleme :
ClientSocket, ServerSocket Silence radio (sendstream) [ par Bastard60 ]
Salutation belle compagnie, ça faisait un petit moment que j'avait pas ecrit pour pleurer l'aide d'eminences grises, plus grises que moi. Voila j
Pas deTWebBrowser dans Delphi édition personal [ par estra ]
Bonjour,Je voudrais utiliser WebBrowser avec Dephi 7 ou 2005 en édition personnelle .Même après avoir installé Indy, pas de groupe
ReceiveStream Comment [ par koaiz ]
Salut les Pro J'esseye de tous les moyen d'envoyer une image avec une socket et j?ai reussi a la metre dans un stream et a l'envoyer avec sendStr
Comment lire un stream avec clientsocket [ par koaiz ]
Salut Comment lire une stream avec clientsocket si en l'envoi avec ServerSocket.socket.endStream plus on vie plus on apprend
|
Derniers Blogs
TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0 par odewit
Je viens de publier la version 3.0 de Perspective pour Silverlight, qui regroupe un portage sous Silverlight 5.0 des fonctionnalités de Perspective 2.0, le framework 3D de haut-niveau introduit récemment et de nouveaux exemples de code. En voici la li...
Cliquez pour lire la suite de l'article par odewit TECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVERTECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVER par ROMELARD Fabrice
Speaker : Nadia Ben El Kadi Configuration machine La session commence par la toute première question à se poser lors de la mise en place d'environnement SQL Server, la configuration des machines : Type de mac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SITECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SI par ROMELARD Fabrice
Speakers : Fabrice Barbin, Samuel Blanchard, Julien Lo Presti Titre Prometteur et attractif invitant à voir comment lier le composant ludique Kinect dans le cadre d'une structure IT classique, notamment au travers de la plat...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOURTECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOUR par ROMELARD Fabrice
KeyNotes du premier jour pour les développeurs. La session est principalement axée sur une des principales directions prise par Microsoft à travers tous ses nouveaux produits : Cloud privé ou public (Solution Azure) ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|