madman
24-05-2003, 19:51:41
Hola!
Gracias a un compañero del Club, a partir de un hilo anterior pude enviar imagenes a traves de la red.
Pero lo que pasa es que como uso un TTimer para estar continuamente viendo desde el Servidor lo ke pasa en la PC Cliente, cuando mando la imagen parece 'cortar' o interrumpir el uso del S.O. normalmente. Ej: Si estas moviendo una ventana o algun proceso que use graficos. El cursor del mouse igual ke el grafiko se interrumpen.
He aki el codigo ke uso para capturar la imagen del Escritorio:
{Crea una imagen, capturando lo que existe en la pantalla actual}
procedure TForm1.CrearImg(_path: string; _file:string);
var
imag: TImage;
jpg: TJpegImage;
desktop: TCanvas;
str: TMemoryStream; //Stream donde cargaremos la imagen
begin
imag:=TImage.Create(Form1);
imag.Width:=screen.Width;
imag.Height:=screen.Height;
desktop:=TCanvas.Create;
with DeskTop do
Handle := GetWindowDC (GetDesktopWindow) ;
with Imag.Canvas do
CopyRect (Rect (0, 0, screen.Width, screen.Height),DeskTop,Rect (0, 0, screen.Width, screen.Height));
jpg:=TJPegImage.Create;
jpg.Assign(imag.Picture.Bitmap);
imag.Free;
jpg.CompressionQuality:=25; //Calidad del JPEG
jpg.Compress; //Comprimimos la imagen
str:=TMemoryStream.Create;
jpg.SaveToFile(_path+_file);
jpg.Free;
desktop.Free;
end;
::: Este es el Codigo del TTimer (cada 5 segundos) :::
procedure TForm1.TimerSendImgTimer(Sender: TObject);
var
str: TMemoryStream; //Stream donde cargaremos la imagen
mi_jpeg: TJPEGImage;
strPath : string;
begin
strPath:=ExtractFileDir(Application.ExeName)+'\';
CrearImg(strPath,'imgtmp.jpg'); //Creamos la imagen
mi_jpeg:=TJPEGImage.Create;
mi_jpeg.LoadFromFile(strPath+'imgtmp.jpg'); //cargamos la imagen
str:= TMemoryStream.Create; // iniciamos nuestro Stream
mi_jpeg.SaveToStream(str); //asignamos la imagen al Stream
NMStrm1.Host:=edServer.Text; // IP del PC donde enviaremos
NMStrm1.PostIt(str); // enviamos el stream
str.Free; //liberamos el stream
mi_jpeg.Free; // liberamos el JPEG
end;
Todo eso es para el envío de la imagen el Servidor es el que recibe la imagen por medio de:
procedure TfrmMain.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
mi_jpeg: TJPEGImage; //nuestra imágen
strPath:string;
begin
strPath:=ExtractFileDir(Application.Exename)+'\'; // Le sumamos una diagonal inversa (aunke no aparezca en este post)
mi_jpeg:= TJPEGImage.Create;
mi_jpeg.LoadFromStream(strm);
mi_jpeg.SaveToFile(strPath+'Imagen.jpg');
ImageRecFromClient.Picture.LoadFromFile(strPath+'Imagen.jpg');
end;
Como es una Red Local (LAN) el envio de la imagen ( a veces llega ser del tamaño de 100 Kb, dependiendo) la aplicacion hace lo que les platicaba al principio.
Quisiera saber como poder hacer un envio mucho más rapido, para no interferir con el uso de la PC Cliente. Como lo hace el Neetmeting cuando se comparte el Escritorio el envio de la imagen depende de la conexion es cierto, pero no se nota que lo estes haciendo.
Saludos y espero que alguien me pueda ayudar.
Gracias a un compañero del Club, a partir de un hilo anterior pude enviar imagenes a traves de la red.
Pero lo que pasa es que como uso un TTimer para estar continuamente viendo desde el Servidor lo ke pasa en la PC Cliente, cuando mando la imagen parece 'cortar' o interrumpir el uso del S.O. normalmente. Ej: Si estas moviendo una ventana o algun proceso que use graficos. El cursor del mouse igual ke el grafiko se interrumpen.
He aki el codigo ke uso para capturar la imagen del Escritorio:
{Crea una imagen, capturando lo que existe en la pantalla actual}
procedure TForm1.CrearImg(_path: string; _file:string);
var
imag: TImage;
jpg: TJpegImage;
desktop: TCanvas;
str: TMemoryStream; //Stream donde cargaremos la imagen
begin
imag:=TImage.Create(Form1);
imag.Width:=screen.Width;
imag.Height:=screen.Height;
desktop:=TCanvas.Create;
with DeskTop do
Handle := GetWindowDC (GetDesktopWindow) ;
with Imag.Canvas do
CopyRect (Rect (0, 0, screen.Width, screen.Height),DeskTop,Rect (0, 0, screen.Width, screen.Height));
jpg:=TJPegImage.Create;
jpg.Assign(imag.Picture.Bitmap);
imag.Free;
jpg.CompressionQuality:=25; //Calidad del JPEG
jpg.Compress; //Comprimimos la imagen
str:=TMemoryStream.Create;
jpg.SaveToFile(_path+_file);
jpg.Free;
desktop.Free;
end;
::: Este es el Codigo del TTimer (cada 5 segundos) :::
procedure TForm1.TimerSendImgTimer(Sender: TObject);
var
str: TMemoryStream; //Stream donde cargaremos la imagen
mi_jpeg: TJPEGImage;
strPath : string;
begin
strPath:=ExtractFileDir(Application.ExeName)+'\';
CrearImg(strPath,'imgtmp.jpg'); //Creamos la imagen
mi_jpeg:=TJPEGImage.Create;
mi_jpeg.LoadFromFile(strPath+'imgtmp.jpg'); //cargamos la imagen
str:= TMemoryStream.Create; // iniciamos nuestro Stream
mi_jpeg.SaveToStream(str); //asignamos la imagen al Stream
NMStrm1.Host:=edServer.Text; // IP del PC donde enviaremos
NMStrm1.PostIt(str); // enviamos el stream
str.Free; //liberamos el stream
mi_jpeg.Free; // liberamos el JPEG
end;
Todo eso es para el envío de la imagen el Servidor es el que recibe la imagen por medio de:
procedure TfrmMain.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
mi_jpeg: TJPEGImage; //nuestra imágen
strPath:string;
begin
strPath:=ExtractFileDir(Application.Exename)+'\'; // Le sumamos una diagonal inversa (aunke no aparezca en este post)
mi_jpeg:= TJPEGImage.Create;
mi_jpeg.LoadFromStream(strm);
mi_jpeg.SaveToFile(strPath+'Imagen.jpg');
ImageRecFromClient.Picture.LoadFromFile(strPath+'Imagen.jpg');
end;
Como es una Red Local (LAN) el envio de la imagen ( a veces llega ser del tamaño de 100 Kb, dependiendo) la aplicacion hace lo que les platicaba al principio.
Quisiera saber como poder hacer un envio mucho más rapido, para no interferir con el uso de la PC Cliente. Como lo hace el Neetmeting cuando se comparte el Escritorio el envio de la imagen depende de la conexion es cierto, pero no se nota que lo estes haciendo.
Saludos y espero que alguien me pueda ayudar.