Hola
escafandra
Gracias por tus aclaraciones, que se entienen muy bien. Solo me falta entender como componer la imagen con la resta enviada. Quiza me lo expliques mejor mas adelante
, pero ahora otro tema que quiza te interese bastante mas.
Ya he aplicado la resta de imagenes.
Despues de muchas pruebas y comprobar que solo funciona si creo como globales los Bitmap que usa CreateSubtractBitmap en vez de crear (no la anterior oldScreen porque esa tiene que ser global si o si) y destruir los objetos cada vez. Con la funcion que presento abajo (muchas gracias por CreateSubstractBitmap) ya envio solo la diferencia. Me queda "completar" la imagen en destino (ahora solo se ve la diferencia/resta, jejeje). Aunque se envie solo la diferencia en bitmap ocupa un monton, asi que sigo enviando en png.
Peeeerooooo.. Al usar tu funcion consecutivamente, a los pocos segundos..."Out of memory resources", si mando la pantalla completa (es decir sin usar la funcion) se puede tirar horas sin "romperse" y sin consumir ram (que es el principio de este hilo, que nos estamos desviando, jejeje).
¿Se te ocurre que puede ser?
Código Delphi
[-]
var
oldScreen: TBitMap;
LScreen: TBitmap;
procedure TscrServer.ScreenShot(Image: TBitmap);
var
DC: HDC;
begin
DC := GetDC(GetDesktopWindow);
try
Image.Canvas.Lock;
Image.Width := GetDeviceCaps(DC, HORZRES);
Image.Height := GetDeviceCaps(DC, VERTRES);
BitBlt(Image.Canvas.Handle, 0, 0, Image.Width,
Image.Height, DC, 0, 0, SRCCOPY);
Image.Canvas.UnLock;
finally
ReleaseDC(GetDesktopWindow, DC);
end;
end;
procedure TscrServer.SendScreen(AContext: TIdContext; cliente: word);
var
msg: string;
LBuffer: TBytes;
LBytesStream: TBytesStream;
LBitmap: TBitmap;
LPngImage: TPngImage;
begin
LBitmap := TBitmap.Create;
LPngImage := TPngImage.Create;
ScreenShot(LScreen);
if primeravez = True then
LBitmap.Handle := CreateSubstractBitmap(LScreen.Canvas.Handle, oldScreen.Canvas.Handle)
else
begin
LBitmap.Canvas.Lock;
LBitmap.Assign(LScreen);
LBitmap.Canvas.UnLock;
end;
LBytesStream := TBytesStream.Create;
try
LPngImage.CompressionLevel := calidadCompresion;
LPngImage.Canvas.Lock;
LPngImage.Assign(LBitmap);
LPngImage.Canvas.Unlock;
LPngImage.SaveToStream(LBytesStream);
SetLength(LBuffer, LBytesStream.Size + 1);
Move(LBytesStream.Bytes[0], LBuffer[0], LBytesStream.Size);
if primeravez = False then
begin
msg := '[SCR-' + IntToStr(LBytesStream.Size) + ']';
primeravez := True;
end
else
msg := '[DIF-' + IntToStr(LBytesStream.Size) + ']';
IdTCPServerSCRresponse(msg, AContext);
ActualizaEstado('>SCR-SERVIDOR-' + AContext.Connection.Socket.Binding.PeerIP +
':' + IntToStr(AContext.Connection.Socket.Binding.PeerPort) +
' ' + msg);
clientes[cliente].IOHandler.Write(LBuffer);
finally
LBitmap.Free;
LPngImage.Free;
LBytesStream.Free;
SetLength(LBuffer, 0);
end;
oldScreen.Canvas.Lock;
oldScreen.Assign(LScreen);
oldScreen.Canvas.Unlock;
EsperaSegundos(0.001);
end;
¿Voy pididiendo algo para picar?