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 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010TECHDAYS PARIS 2010 : PLAN DE MIGRATION VERS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Arnault Nouvel et Antoine Dongois Le processus à prendre : Apprendre (découvrir la plateforme) Préparer (documenter l'historique et choisir la méthode de MAJ) Test (Test de MAJ) Implémenter (Effectuer la MAJ) Valid...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOURTECHDAYS PARIS 2010 : LA PLEINIèRE DU SECOND JOUR par ROMELARD Fabrice
Après un retour sur l'histoire des TechDays de Paris et le fait que ce soit le plus gros event MS au monde (du fait de sa gratuité), le président de MS France (Eric Boustoullier) a fait une présentation de la vision Microsoft pour les années à venir...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice CRéATION D'UNE BASE DE DONNéE SOUS SQL AZURECRéATION D'UNE BASE DE DONNéE SOUS SQL AZURE par junarnoalg
Sans rentrer dans les détails, je me propose ici de faire un rapide tour de ce que propose SQL Azure.
SQL Azure est avant tout un service d'hébergement de base de données relationnelles construit sur SQL Server. Il permet aux entreprises d...
Cliquez pour lire la suite de l'article par junarnoalg TECHDAYS PARIS 2010 : LES SERVICES D'APPLICATIONS DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LES SERVICES D'APPLICATIONS DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Xavier Moreels et Julien Bakmezdjian Ce sujet est lié au partage des applications comme services dans SharePoint 2010, ceci représente la possibilité de créer sa propre application qui sera utilisable comme ceux en standard : Search...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|