Capture d'écran à distance trés lent

cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015 - 10 mai 2009 à 15:08
Bacterius Messages postés 3792 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;

10 réponses

cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015
10 mai 2009 à 15:16
j'ai creer un timer pour calculer les frames par second resultat : 5 images par second
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
10 mai 2009 à 18:15
5 images par seconde c'est déjà pas mal ^^
Sinon, une petite mise en forme de ton code ? :)

Cordialement, Bacterius !
cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015
11 mai 2009 à 02:51
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 .
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
11 mai 2009 à 19:01
Ben remet en forme ton code parce que PERSONNE ne prendra le temps de le lire sinon ...

Cordialement, Bacterius !

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015
11 mai 2009 à 19:06
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;
cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015
12 mai 2009 à 20:46
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 .
cs_bazbazus Messages postés 119 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 27 août 2015
12 mai 2009 à 20:47
ya pas une autre solution de capture qui prend pas beaucoup le travail de processus
cs_darkcodersc Messages postés 7 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 20 novembre 2009
23 juil. 2009 à 16:21
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
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
23 juil. 2009 à 16:24
darkcodersc -> Pas de style SMS s'il te plait !
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 juil. 2009 à 17:51
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 !
Rejoignez-nous