Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Optimizar el envio de una imagen... (JPG) (https://www.clubdelphi.com/foros/showthread.php?t=794)

madman 24-05-2003 18:51:41

Optimizar el envio de una imagen... (JPG)
 
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:
Código:

{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) :::
Código:

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:

Código:

procedure
Código:

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.

diegofhernando 28-05-2003 02:10:15

Hola... Pues reconozco parte del cóigo que tienes la verdad es que para hacer una aplicación que te mantenga informado acerca de lo que sucede en un PC remoto es complentamente inadecuado actualizar toda la pantalla del cliente, pues por las razones que explicas... como comentanba en un hilo anterior (me imagino que de donde obtuviste parte del código), tengo unos prototipos para realizar una aplicación de este estilo... en estos momentos no podría compartirte el código que utilizo pero la base está en actualizar sólo aquellas regiones de la pantalla que han sufrido cambios, como botones y barras, es algo complicado pero se puede hacer es mas tengo gran parte terminada el inconveniente está en simular los clicks pues para todos los componentes windows no es igual... Espero que al terminar pueda aportarle al foro el código...

Salu2 desde Colombia :cool:

madman 29-05-2003 17:46:59

Hola! ke tal...

No habia podido comentar nada, ya que me reinstale todo el S.O. en mi PC.

Gracias por tu comentario diegofernando, cualkier idea o aportación me ayuda a mi y a los compañeros del Club.

Y dime funciono la segunda idea, que propuse en el hilo "Indy y modem". Sobre chekar el estado de los clientes conectados... ??

Hasta luego... stamos en contact.

diegofhernando 03-06-2003 19:09:42

Claro que funcinó, no de la misma forma que sugeriste pero funcionó jeje... agradezco tu colaboración. :cool:

nochas 11-06-2008 18:29:31

Instalar componente
 
mi duda es la siguiente como instalo el componente ke utilizan para mandar la imagen a travez de la LAN "NMStrm1" tengo el delphi7 y al parecer no tengo la bpl dclNMF70. Si me la pueden pasar ke mejor


La franja horaria es GMT +2. Ahora son las 11:59:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi