![]() |
Mehrere TJpegImage in einen Stream
Ich versuche mehrere Jpegs (zusammen mit einigen anderen Daten) in einen Stream zu speichern und wieder zu laden.
Das Speichern ist soweit kein Problem aber beim Laden gibt es einen Fehler. Bei der Suche bin ich auf das hier gestoßen: ![]() Der Fehler liegt also daran, dass TJpegImage.LoadFromStream immer bis zum Ende des Streams liest und man könnte ihn durch das Speichern der Position und Größe des Images umgehen. Allerdings muss man dann im Stream springen und dass stört soweit ich weiß den RC4-StromDekorierer von maximov ( ![]() Gibt es irgend eine andere Methode diesen Fehler zu umgehen? |
Re: Mehrere TJpegImage in einen Stream
Hat sich erledigt mir ist doch noch was eingefallen.
Wenns noch jemand interessiert ist hier meine Lösung (als Erweiterung des FileStreams)
Delphi-Quellcode:
[Edit]
procedure TFileStreamEx.WritePicture(Pic: TPicture);
var Typ: Byte; Len: Integer; MS: TMemoryStream; begin if Pic.Graphic is TBitmap then begin Typ := FILETYPE_BMP; Write(Typ, SizeOf(Typ)); Pic.Bitmap.SaveToStream(self); end else if Pic.Graphic is TJpegImage then begin Typ := FILETYPE_JPG; Write(Typ, SizeOf(Typ)); MS := TMemoryStream.Create; try Pic.Graphic.SaveToStream(MS); Len := MS.Size; WriteInteger(Len); CopyFrom(MS, 0); finally MS.Free; end; end; end; procedure TFileStreamEx.ReadPicture(Pic: TPicture); var Typ: Byte; Len: Integer; MS: TMemoryStream; begin Read(Typ, SizeOf(Typ)); if Typ = FILETYPE_BMP then begin Pic.Bitmap := TBitmap.Create; Pic.Bitmap.LoadFromStream(self); end else if Typ = FILETYPE_JPG then begin Pic.Graphic := TJpegImage.Create; Len := ReadInteger; MS := TMemoryStream.Create; try MS.CopyFrom(self, Len); MS.Position := 0; Pic.Graphic.LoadFromStream(MS); finally MS.Free; end; end; end; FILETYPE_BMP und FILETYPE_JPG sind Byte-Konstanten WriteInteger/ReadInteger gehören auch zu meinem FileStreamEX und sind nur zur leichteren Bedinung da[/Edit] |
Re: Mehrere TJpegImage in einen Stream
Warum schreibst du beim Typ FILETYPE_BMP nicht auch die Länge der folgenden Daten ?
Also ich würd's tun. |
Re: Mehrere TJpegImage in einen Stream
Ich glaube dieser "Fehler" tritt nur bei Jpegs auf, weil deren Länge nicht eindeutig festzustellen ist. Bitmaps wurden bei mir bis jetzt immer richtig geladen (auch mehrere hintereinander). Ich könnte die Länge natürlich trotzdem dazuschreiben und beim Laden dann wieder den Umweg über den MemoryStream gehen, aber ich denke das kann man sich bei bmps sparen
[Edit]Ich vermute mal das ein Bitmap seine Länge selber irgendwo speichert und beim Laden nur die entsprechende Stelle im Stream liest [/Edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz