Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi jpg aus stream direkt in Timage? (https://www.delphipraxis.net/122222-jpg-aus-stream-direkt-timage.html)

ToXiC 11. Okt 2008 16:54


jpg aus stream direkt in Timage?
 
hallöchen
ich wüsste gern ob es möglich ist einen per socket versendeten stream direkt,
also ohne zwischenspeichern auf der festplattte mit

Delphi-Quellcode:
stream.SaveToFile(pfad)
in ein Timage zu laden.
mit einer bitmap gelingt es mit durch ein tutorial gut:

Delphi-Quellcode:
Image.Picture.Bitmap.LoadFromStream(stream)
mit einer jpeg datei gelingt mir dies nur leider nicht ohne lästiges zwischenspeichern.
ich habe die unit 'jpeg' included, was allerdings auch nicht half.

sry wenn das thema bereits öfters existiert, doch ich konnte nach einer halbstündigen suche keinen identischen fall finden.

mfg

toxic

RaSoWa1 11. Okt 2008 17:14

Re: jpg aus stream direkt in Timage?
 
Hallo Toxic,

hier ein Code-Auszug aus einem meiner Programme, wo ich ein ähnliches Problem hatte, zum experimentieren.
Delphi-Quellcode:
procedure ...
var TmpJpg : TJPEGImage;
     MS     : TMemoryStream;
begin
  ....
    TmpJpg := TJPEGImage.Create;
    try
      ....
      MS := TMemoryStream.Create;
      try
        TmpJpg.SaveToStream(MS);
        .....
        TmpJpg.LoadFromStream(MS);
        ImageNach.Picture.Assign(TmpJpg);
      finally
        MS.Free;
        end;
    finally
      TmpJpg.Free;
      end;
end;
Viele Grüße Klaus

ToXiC 12. Okt 2008 20:08

Re: jpg aus stream direkt in Timage?
 
ich weiß nicht was ich falsch mache, jedoch spuckt das kompilierte programm unverständliche fehlermeldungen in form von sinnlosen zeichenketten.

ich habe deinen code versucht wie folgt in einen vorgegeben code zu implementieren:


Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  s, sl: string;
  TmpJpg : TJPEGImage;
  Reciving: boolean;
  DataSize: integer;
  Data: TMemoryStream;
begin
  s:= Socket.ReceiveText;
  if not Reciving then
  begin
    SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
    StrLCopy(@sl[1], PChar(s), Length(sl)-1);
    DataSize:= StrToInt(sl);
    Data:= TMemoryStream.Create;
    TmpJpg := TJPEGImage.Create;
    Delete(s, 1, Length(sl));
    Reciving:= true;
  end;
  try
    Data.Write(s[1], length(s));
    if Data.Size = DataSize then
    begin
      Data.Position:= 0;
      TmpJpg.LoadFromStream(Data);
      Image2.Picture.Assign(TmpJpg);
      Data.Free;
      TmpJpg.Free;
      Reciving:= false;
      Socket.Close;
    end;
  except
    Data.Free;
    TmpJpg.Free;
  end;
end;
:wiejetzt:

hat jemand eine idee was ich falsch mache?


//edit

habe den fehler glaub ich gefunden:
das jpegimage muss vor der if-abfrage created werden.
danke

// edit 2

das war allerdings nicht der hauptgrund für die seltsamen fehlermeldungen:
die variablen

Reciving: boolean;
DataSize: integer;
Data: TMemoryStream;

müssen allesamt global definiert werden.
ist das plausibel & nur ich verstehs nicht?
wenn ja klärt mich bitte auf!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz