Wysyłanie grafiki : TIdTCPClient, TIdTCPServer

0

Temat byl juz poruszany wielokrotnie ale wiekszosc osob prezentowala rozwiazania z wykorzystaniem socketow...
Inni natomiast napominali ze uzycie TIdTCPClient bylo by znacznie bardziej komfortowe; w ponadym przypadku jednakze nikt nie zaproponowal kodu realizujacego ow funkcje.

Probowalem cos zamemu "naskrobac" ale niestety nie funkcjonuje to ani troszke :-/

Procedura wysylajaca dane:

var
  Bitmap : TBitmap;
  ScreenDC : HDC;
  FJpeg : TJpegImage;
  MStream : TStream;
begin
  Bitmap := TBitmap.Create;
  Bitmap.Width := GetSystemMetrics(SM_CXSCREEN);
  Bitmap.Height := GetSystemMetrics(SM_CYSCREEN);
  ScreenDC := GetDC(0);
  BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width,
    Bitmap.Height, ScreenDC, 0, 0, SRCCOPY);
  ReleaseDC(0, ScreenDC);
  FJpeg := TJpegImage.Create;
  FJpeg.Assign(Bitmap);
  FJpeg.CompressionQuality := 50;
  FJpeg.Compress;
  MStream := TMemoryStream.Create;
  FJpeg.SaveToStream(MStream);

  if Edit1.Text <> '' then
  begin
    Klient.Host := Edit1.Text;
    Klient.Connect;
    if Klient.Connected then
    begin
      Klient.WriteStream(MStream);
      Klient.Disconnect;
    end;
  end;

I pora na odbierajaca z ktora w ogole sobie juz nie radze:

var
  ms: TMemoryStream;
  Image: TJPEGImage;
begin
  ms := TMemoryStream.Create;
  Image := TJPEGImage.Create;
  Athread.Connection.ReadStream(ms);
  ms.Position := 0;
   Image.LoadFromStream(ms);
  Image1.Picture.Graphic := Image;

Milo bylo by gdyby ktos wychwycil moje bledy i wskazal jak prawdidlowo powinienem rozpatrzyc zadanie ;-)
Z gory dzieki :-)

0

Przed wysłaniem, i po odebraniu strumienia, musisz "ustawić się" na jego początku:

MStream.Position := 0; //Jeden sposób
MStream.Seek(0, soFromBeginning);
0

Kwestia w tym ze procedurka wysylania teoretycznie dziala...
Nie wywala zadnego bledu a ustawienie na poczatku przeciez mialem...

Jesli chodzi o odior, sama "komenda" wywoluje juz blad:
Athread.Connection.ReadStream(ms);

Czy to poprawny zapis?

Panowie bardzo zalezy mi na tym kodzie :-)

0
  FJpeg.SaveToStream(MStream);

  if Edit1.Text <> '' then
  begin
    Klient.Host := Edit1.Text;
    Klient.Connect;
    if Klient.Connected then
    begin
      Klient.WriteStream(MStream);
      Klient.Disconnect;
    end;
  end;

Gdzie w tym kodzie Position jest ustawiane na 0? :P

0

Piotrek problem w tym ze nanioslem zasugerowana przez Ciebie poprawke ale ta nic nie zmienia.

Procedura odbierania wywala za kazdym razem blad :-/

0
WriteStream(AStream: TStream; const AAll: Boolean = True; const AWriteByteCount: Boolean = False; const ASize: Integer = 0);

Tak wygląda deklaracja procedury wysyłania. Dawno nie używałem Indy, ale z tego co pamiętam pamiętam, żeby nie było problemów, ustaw AAll i AWriteByteCount na True, a w ASize Podaj Strumien.Size. Powinno pomóc.

0

hmm
teraz wyskakuje blad:
TStream.Seek not implemented

nadal w kropce...
nowe procedury wysylania odbierania:

procedure TForm1.Button2Click(Sender: TObject);
var
  Bitmap : TBitmap;
  ScreenDC : HDC;
  FJpeg : TJpegImage;
  MStream : TStream;
begin
  Bitmap := TBitmap.Create;
  Bitmap.Width := GetSystemMetrics(SM_CXSCREEN);
  Bitmap.Height := GetSystemMetrics(SM_CYSCREEN);
  ScreenDC := GetDC(0);
  BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width,
    Bitmap.Height, ScreenDC, 0, 0, SRCCOPY);
  ReleaseDC(0, ScreenDC);
  FJpeg := TJpegImage.Create;
  FJpeg.Assign(Bitmap);
  FJpeg.CompressionQuality := 50;
  FJpeg.Compress;
  MStream := TMemoryStream.Create;
  FJpeg.SaveToStream(MStream);
  MStream.Position := 0; //Jeden sposób
//MStream.Seek(0, soFromBeginning);
  if Edit1.Text <> '' then
  begin
    Klient.Host := Edit1.Text;
    Klient.Connect;
    if Klient.Connected then
    begin
      Klient.WriteStream(MSTream,true,true,MStream.Size);
      Klient.Disconnect;
    end;
  end;
end;

procedure TForm1.SerwerConnect(AThread: TIdPeerThread);

var
  ms: TStream;
  Image: TJPEGImage;
begin
  ms := TStream.Create;
  Image := TJPEGImage.Create;
  Athread.Connection.ReadStream(ms);

  MS.Position := 0; //Jeden sposób
  MS.Seek(0, soFromBeginning);

  Image.LoadFromStream(ms);
  Image1.Picture.Graphic := Image;


end;
0

to czemu deklarujesz jako TStream a nie TMemoryStream ?

0

TMemoryStream jest pochodna od TStream ale mniejsza z tym czemu ja deklaruje.
Jak widac sam nie do konca wiem jak sie za to zabrac - stad ten problem.

Jesli bylbys tak mily zaprezentowalbys jakies KONKRETY ;-/
Ehhh nie oczekuje ze ktos za mnie te dwie procedury napisze...
Ale dotychczasowe starania nie przynosza skutku...

Zreszta sprawdzenie dotychczasowego kodu innemu uzytkownikowi zajelo by 5 minut (maksymalnie) to chyba nie tak duzo (?) tymbardziej ze poruszony przeze mnie temat jest o tyle atrakcyjny ze nie jednej osobie sie przyda :-]

PS
Kolejno mozna by wrzucic to rozwiazanie do dzialu Gotowce - a to juz konkretna pomoc dla calej naszej spolecznosci (...)

0

Dwie sprawy:

Spróbuj TMemoryStream zamiast TStream.

I po co dwa razy przenosisz się na poczatek strumienia?

  MS.Position := 0; //Jeden sposób
  MS.Seek(0, soFromBeginning);

To jest bez sensu, albo zmiana Position, albo Seek.

0

OK a wiec testowalem zarowno TStream jak i TMemoryStream...
A jesli chodzi o to przenoszenie...
robilem tez na dwojaki sposob ;-) ale to nic nie dalo ;-]

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