Dzielenie JPEGa na pakiety...

0

Dobra mam taką procedurkę:

var
 I: Integer;
 M: TMemoryStream;
 Buf: Array[0..1024] of Char;
begin
 M := TMemoryStream.Create;
 Image1.Picture.Graphic.SaveToStream(M);
 I := 0;
 repeat
  M.Position := (I*1024);
  Buf := '';
  if (M.Size-M.Position>=1024) then
   M.ReadBuffer(Buf, 1024)
  else begin
   M.ReadBuffer(Buf, M.Size-M.Position);
   M.Position := M.Size;
  end;
  Inc(I);
  { Tu wysyłam pakiet JPEGa - Buf }
 until M.Position=M.Size;
end;

Może mi ktoś powiedzieć dlaczego nie daje mi to oczekiwanego efektu, którym z założenia ma być podzielenie JPEGa na poakiety po 1024 bajtów i wysłanie ich (nie ważne czym ;) chodzi o podzielenie )

0

Heh, ano nie daje efektów, bo tablica Buf nie ma 1024 elementów, tylko 1025!!
Zadeklarują ją poprawnie (Buf:array[0..1023]of char) i potem wysyłaj pakiet...

0

Kolego nie wiem czy to co tu napisałeś ma <ort>w ogóle </ort>jakąś rację gdyż ja pobieram dane w wielkości 1024 bajtów i jeden bajt więcej nie zaszkodzi bo będzie zastąpiony #0 (widzisz czyszczenie tablicy?)
Zresztą w dlaszej części warunku jest widocznie pokazane jeśli pozostałe dane są mniejsze od 1024 bajtów to pobierz ile pozostało ;)

Jakieś inne sugestie (dalej nie działa...)

BTW kto mi wytłumaczy dlaczego mamy tu niezgodność typów:?

  TPakiet = packed record
....
    Data: Array[0..1023] of Char;
....
  end;

i:

var
 Buf: Array[0..1023] of Char;
 cos: TPakiet;

wtedy gdy ja:

 cos.Data := Buf;
0

Kolego nie wiem czy to co tu napisałeś ma w ogóle jakąś rację gdyż ja pobieram dane w wielkości 1024 bajtów i jeden bajt więcej nie zaszkodzi bo będzie

:-D Dokładnie, ale gdybyś zamiast

{ Tu wysyłam pakiet JPEGa - Buf }

napisał w jaki sposób wysyłasz ten pakiet, to byłoby sporo łatwiej. Wysyłając ten pakiet poprzez ClientSocket.Sendtext() wysyłasz przecież całą tablicę, a więc pełne 1025 bajtów, więc być może dlatego Ci to nie działa...

Zresztą tę pętlę można by przecież uprościć:

repeat
   if (M.Size-M.Position>=1024) then
      M.ReadBuffer(Buf, 1024)
   else
      M.ReadBuffer(Buf, M.Size-M.Position);
 
   { Tu wysyłam pakiet JPEGa - Buf }

until M.Position=M.Size;

Funkcja ReadBuffer przesuwa Position w strumieniu i w ten sposób żadna zmienna pomocnicza nie będzie potrzebna...

0

BTW kto mi wytłumaczy dlaczego mamy tu niezgodność typów:?

Zrób tak:

  TKiloByte = array [0..1032] of Byte;
  TPakiet = packed record
....
    Data: TKiloByte;
....
  end;
...
var
 Buf: TKiloByte;
 cos: TPakiet;
...
 cos.Data := Buf;
0

OK Jeśli to pomoże...

  TkB = array[0..1023] of Char;
  TPakiet = packed record
    Header: String[20]; 
    TotalSize: Integer; 
    Data: TkB;
  end;

Wysyłanie:

var
 PSend: TPakiet;
begin
........
 cli.Socket.SendBuf(PSend, SizeOf(PSend));
........

podać coś jeszcze?

0

Oki MrSquell, dzielenie jpega wygląda prawidłowo, ewentualne błedy mogą chyba wynikać już tylko z błedu w programie odbierającym te dane...

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