PDA

Ver la Versión Completa : Enviar una imagen por red de forma Optimizada


fide
15-09-2007, 02:56:45
Hola amigos, el echo es que estoy desarrollando un programa que se encarga de enviar imágenes por la red hacia un servidor central. Es algo asi como un monitor de Red. y bueno, creo que seria magnifico enviar solo las partes que cambian de la imagen que se capturo por ultima vez.

Lo que necesito es algo asi como un algoritmo o algunas ideas de como puedo hacer esto. Para que los archivos que mando no seas tan pesados y no me colapsen la Red..

Gracias de antemano!!

l30
16-09-2007, 20:36:38
Hola fide (http://www.clubdelphi.com/foros/member.php?u=13597), hace un tiempo atrás me hizo falta hacer un detector de movimientos, por lo que tenia que comparar, dos imagines par ver si sufrían algún cambio allí te va parte del código. De lo otro que hablas es de los archivos que no sean tan pesado bueno en el otro post que pusiste te explico como llevar la imagen de .bmp que se llevaría 3megas a .jpg que en mi caso no pasa de los 20 kb pienso que quede resuelto tu problema, el codigo que te puse aquí le faltan algunas variables por declarar que pienso que no haga falta ponerlas, de todas manera si tienes problemas me dices. NO te escribo el código para mandar la foto por la red porque parece que ya lo tienes echo, si te hace falta dímelo también.

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Clipbrd, ComCtrls, shellapi, IdHTTP, IdSMTP, IdMessage,
Sockets;

//**************************************

var
error : int64;
i, j : integer;
hayMovimiento : boolean;
begin
if idResultado <> 0 then
begin
try
//capturamos la imagen actual
SendMessage(idResultado, WM_CAP_EDIT_COPY, 0, 0);
imagenActual.Assign(imagenAnterior);
//la imagen anterior está guardada en el portapapeles, la obtenemos
imagenAnterior.LoadFromClipBoardFormat(cf_BitMap,
ClipBoard.GetAsHandle(cf_Bitmap), 0);
error := 0;
//recorremos todos los píxeles de la imagen actual
for i := 0 to imagenActual.Width do
begin
for j:= 0 to imagenActual.Height do
begin
//comparamos el pixel de la imagen actual con el correspondiente
//a la imagen anterior
error := error + abs(imagenActual.Canvas.Pixels[i, j] -
imagenAnterior.Canvas.Pixels[i, j]);
end;
end;
//mostramos el porcentaje de error
txtError.Text := FloatToStr(trunc(error / 20000000)/100);


except
bDetenerClick(Self);
raise;
end;
hayMovimiento := tbSensibilidad.Position < StrToFloat(txtError.Text);
if (hayMovimiento and Capturar) then
begin
imagenAnterior.SaveToFile(ExtractFilePath(txtUbicacionImg.Text) +
IntToStr(Contador) + ExtractFileName(txtUbicacionImg.Text));
imagenActual.SaveToFile(ExtractFilePath(txtUbicacionImg.Text) +
IntToStr(Contador + 1) + ExtractFileName(txtUbicacionImg.Text));
Contador := Contador + 2;
end;
if hayMovimiento then
begin
txtError.Color := clRed;
TcpClient1.Active:= true;
TcpClient1.Active:= false;

end
else
txtError.Color := clWhite;
end
else
begin
bDetenerClick(Self);
end;
end;