Wyslanie obrazka do serwera

0

Kontrolka ktora wysyla obrazek z Imagecontrol na server

procedure TForm1.Button3Click(Sender: TObject);
var
ms:TMemoryStream;
begin
  ms:=TMemoryStream.Create;
  IdTCPClient2.Host := edit1.Text;
  ImageControl3.Bitmap.SaveToStream(ms);
  IdTCPClient2.IOHandler.LargeStream := True;
  IdTCPClient2.IOHandler.Write(ms, 0, True);
  IdTCPClient2.Disconnect;
end;

A tu co robi z nia server

procedure TForm1.IdTCPServer2Execute(AContext: TIdContext);
var
ms:TMemoryStream;
size : Integer;
begin
 ms := TMemoryStream.Create;
 ms.Position := 0;
 AContext.Connection.IOHandler.LargeStream := true;
 AContext.Connection.IOHandler.ReadStream(ms);
 ImageControl4.Bitmap.LoadFromStream(ms);
 ms.Free;
end; 

Problem wystepuje gdy chce wyslac obrazek jakis komunikat z adresami pamieci . Jak to rozwiazac bym mogl wyslac obrazek z imagecontrol i zeby server go wyswietlil?

0

ms.Position := 0; przed wysłaniem?

0

Zrobilem teraz tak do wysylania

procedure TForm1.Button3Click(Sender: TObject);
var
ms:TMemoryStream;
begin
try
  ms:=TMemoryStream.Create;
  ms.Position := 0;
  IdTCPClient2.Host := edit1.Text;
  ImageControl3.Bitmap.SaveToStream(ms);
  IdTCPClient2.IOHandler.LargeStream := True;
  IdTCPClient2.IOHandler.Write(ms, 0, True);
finally
  IdTCPClient2.Disconnect;
  ms.Free;
end;
end; 

Gdy klikne na buttona dostaje komunikat "Access violation at address 82c8e5c8 , accessing adress 0000...." Co robie nie tak ?

0

No nie no, jak już zmieniasz to Position to raczej - na logikę - po wywołaniu SaveToStream, c'nie?
Co mówi debugger?

0

Wlasnie nie mam jak sprawdzic w debugerze bo robie ta aplikacje w Firemonkey na telefon. A mam porty usb rozwalone... i musze do binarki i przez chmure sciagam aplikacje na telefon.

0

hmm Teraz niby wszystko ok komunikat o wyciekach pamieci ani o polaczeniu nie wyskakuje tylko nie wiem czemu nie chce wyswietlic obrazka
button ktory wysyla

 
procedure TForm1.Button3Click(Sender: TObject);
var
ms :TMemoryStream;
begin
try
ms := TMemoryStream.Create;
IdTCPClient2.Host:=Edit1.Text;
IdTCPClient2.Connect;
Image1.Bitmap.SaveToStream(ms);
ms.Position := 0;
IdTCPClient2.IOHandler.LargeStream := true;
IdTCPClient2.IOHandler.Write(ms,0,True);
finally
  IdTCPClient2.Disconnect;
end;
ms.Free;
end;

I server

 
procedure TForm1.IdTCPServer2Execute(AContext: TIdContext);
var
ms:TMemoryStream;
size : Integer;
begin
 ms := TFileStream.Create;
 try
 ms.Position:= 0;
   AContext.Connection.IOHandler.LargeStream:=true;
   AContext.Connection.IOHandler.ReadStream(ms);
    ms.Position:=0;
   Image2.Bitmap.LoadFromStream(ms);
 finally
  ms.Free;
 end;
end;

Nie chce wyswietlic obrazka co jest nie tak ?

0

Sprawdziłeś, czy jest poprawnie odbierany? (np.czy pierwsze ileśtam bajtów się zgadza?)

0

W sumie nie sprawdzalem. A jak to najlepiej zrobic ? Wyslac rozmiar obrazka a na koncu porownac czy sie zgadza?

0

Na sam początek zrób sztywnego if'a, aby sprawdzić kilka pierwszych bajtów - jak się będą zgadzać, usuń go; a jak nie, to znaczy, że masz to źle wysyłane, dlatego nie wyświetla obrazka.

0

Ok problem rozwiazany. A czy jest jakas mozliwosc by przyspieszyc ten wysyl danych i odbioru ? Bo wysylam 6 obrazkow i miedzy nimi jest jakis odstep 1-2 sekund a chcialbym by te zdjecia zostaly wyslane w ciagu sekundy i wyswietlone w ciagu sekundy.

0

Zapisz wszystkie obrazki do jednego strumienia i wyślij tylko jeden strumień na serwer;

Chyba że wysyłasz kilka obrazków zapisanych osobno, to co innego - ale nie doprecyzowałeś, więc trudno doradzić coś sensowniej; Samo opóźnienie przy wysyłaniu może mieć różne pochodzenie - niekoniecznie od powolnego kodu.

0

Wysylam te pare obrazkow z roznych kontrolek image w ten sposob.

procedure TForm1.Button3Click(Sender: TObject);
var
ms :TMemoryStream;
begin
ms := TMemoryStream.Create;
IdTCPClient2.Host:=Edit1.Text;
IdTCPClient2.Connect;
try
Image1.Bitmap.SaveToStream(ms);
ms.Position := 0;
IdTCPClient2.IOHandler.LargeStream := true;
IdTCPClient2.IOHandler.Write(ms,0,True);
finally
end;
try
Image2.Bitmap.SaveToStream(ms);
ms.Position := 0;
IdTCPClient2.IOHandler.LargeStream := true;
IdTCPClient2.IOHandler.Write(ms,0,True);
finally
end;
IdTCPClient2.Disconnect;
ms.Free;
end; 
0

Coś dziwnie ten kod wygląda; Tutaj aż się prosi o skorzystanie z pętli, bo dla każdego obrazka robisz dokładnie to samo; Poza tym dodaj wcięcia i zwalnianie idTCPClient2 i ms wsadź pomiędzy Finally a End, bo skoro już z tych bloków korzystasz, to zwalnianie instancji klas powinno być zawsze wykonywane na końcu, bez względu na to czy kod zadziałał prawidłowo, czy poleciały wyjątki; No i niepotrzebnie przestawiasz właściwość ms.Position po zapisie obrazka;

No ale co dalej? Kod pokazałeś, ale w sumie nic poza tym; Działa to, czy jest problem? Chcesz wszystkie obrazki wrzucić do jednego strumienia, czy nie możesz tego zrobić? Napisz coś więcej.

0

Ogolnie to pisze aplikacje w rad studio xe6 firemonkey na androida ktora przechwyci obraz z kamery i ja wyswietli(client-server). Na razie mi sie udalo przeslac pojedyncze zdjecia ale za dlugo to idzie.

0

No to nie tak - przesyłaniem za każdym razem całych klatek to się nie uda w rozsądnym czasie, chyba że masz światłowód :P
Musisz je jakoś kompresować po drodze lub robić tak, jak kodeki filmowe: wysłać klatkę i następne opierać na tej wysłanej.

0

No w tym urzadzeniu jest zamontowana kamera o rozdzielczosci 1megapixela i jak byscie rozwiazali ten temat czy robic jakas kompresje czy starac sie by ta transmisja byla szybsza?

0

Rozdzielczość kamery nie jest najważniejsza i wiele nie mówi, dlatego że taką kamerą można robić zdjęcia o różnej rozdzielczości; Jeśli wykonane zdjęcia są dużej rozdzielczości (np. maksymalnej dla tej kamery), to kompresja się przyda - zawsze zaoszczędzisz transferu, kosztem pracy procesora; Rozpakowanie zdjęcia/zdjęć raczej będzie krócej trwało, niż przesłanie w sieci tych nadmiarowych kilobajtów (tym bradziej przy słabym łączu);

Zrób jak uważasz, ale najpierw spraw, aby kod w obecnej postaci działał prawidłowo - potem ewentualnie pomyśl nad kompresją.

0

A kompresja przez bibloteke zlib moze byc ? W sensie czy pojdzie mi to na telefonie przez firemonkey. Niby jest dolaczona w rad studio xe6 ale nie moge jej znalezc..

0

Równie dobrze możesz sobie zapisywać zdjęcia od razu w PNG - ten format korzysta przecież z kompresji zip.

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