Wysłać obrazek - TMemoryStream?

0

Chciałbym wysłać obrazek z ClientSocket do ServerSocket. Chodzi mi dokładnie o zrzut ekranu w formacie TJpegImage. Nie chcę go w ogóle zapisywać na dysku, bo strasznie spowolni to program (b. stary komputer), tylko wysłać i po odebraniu wyświetlić na Image'u. Myślałem, żeby zapisać obrazek do TMemoryStream, wysłać w pakietach po np. 1024B i odbierać składając zpowrotem do TMemoryStream. Czy to dobry pomysł? Liczę na fragmencik kodu, z góry dziękuję, jeśli ktoś się zainteresuje.

0

Lepiej chyba jesli zrobisz to na komponencie Indy. TCPClient
On ma taka metode jak WriteStream. Dziala bardzo dobrze i bardzo szybko. Sam tego uzywam i przesyalm obrazy ale tez inne pliki.
Ja to przesylam na TMemoryStream

0

Na komponentach INDY jeszcze nigdy nic nie robiłem, mam nadzieję, że się za bardzo nie różni od zwykłych socketów. Dzisiaj zobacze, co będę umiał z tym zrobić, dzięki.

0

Jakby co to pisz i pytaj
Chociaz Indy ma swietne przylady, z ktorych mozna sie wiele dowiedziec.

PS. Zwroc uwage na to ze poprzedniego posta zmienilem, bo mi sie walnelo :) ja to robie na WriteStream :)

0

Dzięki za pomoc, ale obeszło się bez INDY. Gdyby ktoś potrzebował, zamieszczam kod:

{W ten sposób wysyłamy plik z klienta:}

procedure TForm1.Button1Click(Sender: TObject);
var
jpg : TJpegImage;
stream : TMemoryStream;
Buffer : array[0..1023] of char;
ReadedSize : integer;
begin
//Tworzymy zmienne
jpg := TJpegImage.Create;
stream := TMemoryStream.Create;

//Pobieramy obrazek do wysłania i pakujemy do strumienia
jpg.Assign(SendPic.Picture.Bitmap);
jpg.CompressionQuality := 80;
jpg.Compress;
jpg.SaveToStream(stream);
stream.Position := 0;

//Tutaj pętelka wysyłająca
try
repeat
application.ProcessMessages;
sleep(5);
ReadedSize := stream.Read(Buffer, SizeOf(Buffer));
if ReadedSize > 0 then client.Socket.SendBuf(Buffer, ReadedSize);
until ReadedSize = 0;
finally
jpg.Free;
stream.Free;
end;
end;

{Wysyłany obrazek znajduje się na komponencie Image1 i jest bitmapką}

{ A na serwerze będziemy mieli mniej/więcej cosik takiego: }

var
stream : TMemoryStream;

procedure TForm1.FormCreate(Sender: TObject);
begin
stream := TMemoryStream.Create;
end;

procedure TForm1.ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Buffer : array[0..1023] of char;
ReceivedSize : integer;
begin
ReceivedSize := socket.ReceiveBuf(Buffer, SizeOf(Buffer));
Stream.Write(Buffer, ReceivedSize);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
stream.Free;
end;

{Możemy sobie zrobić teraz ze strumienia obrazek:
JpegImage.LoadFromStream(stream)
I wyświetlić go na formie:
Image1.Picture.Assign(JpegImage)
lub zapisać:
JpegImage.SaveToFile('C:\Received.jpg')

Autor:
Michał Dąbski
[email protected]
}

Trzeba pilnować, żeby dać programowi czas na połączenie się, a dopiero później wysyłać obrazek, bo inaczej może zgubić kilka pierwszych pakietów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1