Capture d'écran à distance trés lent

Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
- - Dernière réponse : Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
- 23 juil. 2009 à 17:51
bonjour a tous je suis entrain de creer un logiciel " surveillance réseau " j'ai un problem de capture d'ecran j'utilise socket delphi et je fait des capture d'ecran dans le serveur et j'envoi l'image dans un MemoryStream code : Serveur :
jpg:=TJPEGImage.Create;
ImageBureau.Height := Screen.Height;
ImageBureau.Width := Screen.Width;
BitBlt(ImageBureau.Canvas.Handle, 0, 0,Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SrcCopy);
REDIMENSIONNEMENT_PAR_INTERPOLATION_BILINEAIRE(ImageBureau,WidhCapture,heightCapture);
jpg.CompressionQuality:=QualiterCapture;
jpg.GrayScale:=False;
jpg.Assign(ImageBureau);
//////// envoi
ms:= TMemoryStream.Create;
try
jpg.SaveToStream(ms);
ms.Position:= 0;
Socket.SendText(IntToStr(ms.Size) + #0);
Socket.SendStream(ms);
except
ms.Free;
end;

Client :

try
jpg:=TJPEGImage.Create;
s:= Socket.ReceiveText;
if not Recevieng then
begin
SetLength(sl, StrLen(PChar(s))+1);
StrLCopy(@sl[1], PChar(s), Length(sl)-1);
DataSize:= StrToInt(sl);
Data:= TMemoryStream.Create;
Delete(s, 1, Length(sl));
Recevieng:= true;
end;
try
Data.Write(s[1], length(s));
if Data.Size = DataSize then
begin
Data.Position:= 0;
jpg.LoadFromStream(data);
ImageCapture.Picture.Bitmap.Assign(jpg);
if not ArreterCapture then
ClientCaptureDecran.Socket.SendText('envoi');
Data.Free;
Recevieng:= false;
StatusBar1.Panels[1].Text:='Capture D''ecran reçu';
end;
except

if not ArreterCapture then
ClientCaptureDecran.Socket.SendText('envoi');
data.Free;
end;
jpg.free;
end;
Afficher la suite 

10 réponses

Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
0
Merci
j'ai creer un timer pour calculer les frames par second resultat : 5 images par second
Commenter la réponse de cs_bazbazus
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
5 images par seconde c'est déjà pas mal ^^
Sinon, une petite mise en forme de ton code ? :)

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
0
Merci
vnc il affiche en temp real 50 f par second au plus mdr moi je suis connecter a mon propos ordi 127.0.0.1 et je suis a 5 image par seconde .
Commenter la réponse de cs_bazbazus
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Ben remet en forme ton code parce que PERSONNE ne prendra le temps de le lire sinon ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
0
Merci
code Serveur :


jpg:=TJPEGImage.Create;

ImageBureau.Height := Screen.Height;

ImageBureau.Width := Screen.Width;

BitBlt(ImageBureau.Canvas.Handle, 0, 0,Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SrcCopy);

REDIMENSIONNEMENT_PAR_INTERPOLATION_BILINEAIRE(ImageBureau,WidhCapture,heightCapture);

jpg.CompressionQuality:=QualiterCapture;

jpg.GrayScale:=false;

jpg.Assign(ImageBureau);


//////// envoi

ms:= TMemoryStream.Create;

try

jpg.SaveToStream(ms);

ms.Position:= 0;

Socket.SendText(IntToStr(ms.Size) + #0);

Socket.SendStream(ms);

except

ms.Free;

end;

//////// fin denvoi

jpg.free;

code client :



jpg:=TJPEGImage.Create;

s:= Socket.ReceiveText;

if not Recevieng then

begin

SetLength(sl, StrLen(PChar(s))+1);

StrLCopy(@sl[1], PChar(s), Length(sl)-1);

DataSize:= StrToInt(sl);

Data:= TMemoryStream.Create;

Delete(s, 1, Length(sl));

Recevieng:= true;

end;

try

Data.Write(s[1], length(s));

if Data.Size = DataSize then

begin

fps:=fps+1;

Data.Position:= 0;

jpg.LoadFromStream(data);

Data.SaveToFile('c:\also.jpg');

ImageCapture.Picture.Bitmap.Assign(jpg);

if not ArreterCapture then

ClientCaptureDecran.Socket.SendText('envoi');

Data.Free;

Recevieng:= false;

StatusBar1.Panels[1].Text:='Capture D''ecran reçu';

end;

except

if not ArreterCapture then

ClientCaptureDecran.Socket.SendText('envoi');

data.Free;

end;

jpg.free;




except

end;
Commenter la réponse de cs_bazbazus
Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
0
Merci
salut fbalien j'ai trouver la solution aujourduit mais impeut bazare alors j'ai essai de creer plesieur client ( 4 client dans l'pplication d'origine ) et ( 4 application de capture serveur ) sa marche a 20 fps .
il ya un problem quon je fait la capture sur le serveur application me prend 50% de mon processeur est j'ai core de duo 3 ghz alors je dit pas quon je lancer 4 serveur .
Commenter la réponse de cs_bazbazus
Messages postés
121
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
0
Merci
ya pas une autre solution de capture qui prend pas beaucoup le travail de processus
Commenter la réponse de cs_bazbazus
Messages postés
7
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
20 novembre 2009
0
Merci
Je pensse que c'est la conversion qui prend le plus de temps , essay tu vai voir que lorsque tu converti ton image en jpg il se passe presque 1/2 seconde ( sa depend du pc )
o lieu de faire un screen cap et envoi en boucle essay plutot de detecter les position qui change et de modifier que la parti changer sa irra plus vite la conversion ossi
et utilise les gif c bcp moin lourd ! mias qualité moyene .
Greetz DarkCoderSc
Commenter la réponse de cs_darkcodersc
Messages postés
3982
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
9
0
Merci
darkcodersc -> Pas de style SMS s'il te plait !
Commenter la réponse de cs_rt15
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Oh le vilain up !!
En plus tu te trompes sur toute la ligne :

et utilise les gif c bcp moin lourd !


Non, le JPG utilise une méthode de compression, alors que le gif enregistre les pixels tels quels. Donc, JPG plus léger que GIF

mias qualité moyene


Encore perdu ! Le jpg propose une compression (et donc une légereté) très importante, au prix d'une perte de qualité conséquente. Cependant, le GIF n'est soumis à aucune perte de qualité puisque tout est enregistré dans le fichier (cependant, les gifs sont limités en 256 couleurs, donc oui ... on ne peut pas tout avoir ).

Cordialement, Bacterius !
Commenter la réponse de Bacterius