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.
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
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.
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 :)
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.