Capture d'écran à distance trés lent

Signaler
Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015
-
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
-
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

Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015

j'ai creer un timer pour calculer les frames par second resultat : 5 images par second
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
5 images par seconde c'est déjà pas mal ^^
Sinon, une petite mise en forme de ton code ? :)

Cordialement, Bacterius !
Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015

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 .
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Ben remet en forme ton code parce que PERSONNE ne prendra le temps de le lire sinon ...

Cordialement, Bacterius !
Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015

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;
Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015

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 .
Messages postés
120
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
27 août 2015

ya pas une autre solution de capture qui prend pas beaucoup le travail de processus
Messages postés
7
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
20 novembre 2009

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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
darkcodersc -> Pas de style SMS s'il te plait !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
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 !