Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Großes Icon in Stream speichern (https://www.delphipraxis.net/147799-grosses-icon-stream-speichern.html)

patti 16. Feb 2010 16:28


Großes Icon in Stream speichern
 
Hi,

hab im Moment so meine Schwierigkeiten, ein großes Icon (speziell geht es im Moment um die Auflösung 256x256) in einen Stream zu speichern und wieder daraus zu lesen. Bei kleineren Icons (getestet bis 48x48) funktioniert meine Methode einwandfrei, jedoch bei höheren Auflösungen scheint es wie gesagt Probleme zu geben.

Wenn ich mir ein großes Icon besorge und erstmal auf eine Canvas zeichne, dann scheint alles zu funktionieren. Das Icon wird richtig dargestellt und es gibt keine Probleme. Nur nach dem Speichern und Lesen kann ich das Icon nicht mehr verwenden, als Error bekomme ich ein EOutOfRessources bzw. "Falscher Parameter".

Hier mal Ausschnitte aus meinem Quelltext:

Delphi-Quellcode:
procedure WriteIconToStream(var AStream : TStream; AIcon : TIcon);
var ms : TMemoryStream;
var s : integer;
begin
     //-- 
     ms := TMemoryStream.Create;
     //
     try
        ms.Seek(0,soFromBeginning);
        AIcon.SaveToStream(ms);
        s := ms.Size;
        AStream.Write(s, SizeOf(s));
        ms.SaveToStream(AStream);
     finally
        ms.Free;
     end;
end;

procedure ReadIconFromStream(var AStream : TStream; var AIcon : TIcon);
var ms : TMemoryStream;
var s : integer;
begin
     //--
     AStream.Read(s, SizeOf(s));
     //
     ms := TMemoryStream.Create;
     //
     try
       ms.Seek(0,soFromBeginning);
       ms.CopyFrom(AStream, s);
       ms.Seek(0,soFromBeginning);
       AIcon.LoadFromStream(ms);
     finally
       ms.Free;
     end;
end;
Hier treten dann Probleme auf:

Delphi-Quellcode:
var hIcon : TIcon;
var ms   : TStream;
begin
     //--
     hIcon:= TIcon.Create;
     //
     try
       // Icon besorgen... klappt einwandfrei
       //
       Self.Repaint;
       //
       ms := TMemoryStream.Create;
       //
       try
         WriteIconToStream(ms,hIcon);
         ms.Seek(0,soBeginning);
         ReadIconFromStream(ms,hIcon);
         //
         self.Canvas.Draw(150, 150, hIcon); // <-- Nach der Fehlermeldung steht der Cursor in dieser Zeile
       finally
         ms.Free;
       end;
     finally
       hIcon.Free;
     end;
Habe außerdem herausgefunden, dass ich per Icon.LoadFromFile die gleiche Fehlermeldung bekomme, wenn die Icon-Datei nur das 256er Icon enthält.

Entweder stehe ich im Moment völlig auf dem Schlauch und das Problem ist total einfach lösbar - oder aber es handelt es sich um ein grundsätzliches Problem der Icon-Klasse oder so. Hoffe daher auf Hilfe von euch.

Danke schonmal.

patti 17. Feb 2010 16:39

Re: Großes Icon in Stream speichern
 
Nach ca. 24 Stunden mal ein vorischtiger *Push*.

Hat jemand eine Idee, wie ich ein großes Icon fehlerfrei in einen Stream speichern und wieder daraus laden kann? Im Moment gehe ich davon aus, dass in der Icon-Klasse ein Fehler steckt, da es ja mit kleineren Icons funktioniert und der Error "EOutOfRessources" nur bei den großen Icons kommt.

Astat 17. Feb 2010 19:05

Re: Großes Icon in Stream speichern
 
Hallo patti, anbei dein abgeänderter Code. Sieh dir nochmal in aller Ruhe deinen geposteten Code durch,
da ist einiges nicht ganz korrekt. Solltest du dann noch fragen haben, meld dich wieder.


Delphi-Quellcode:

function WriteIconToStream(AIcon: TIcon): TStream;
begin
  Result := TMemoryStream.Create;
  AIcon.SaveToStream(Result);
  AIcon.Free;
  AIcon := nil;
end;

function ReadIconFromStream(AStream: TStream): TIcon;
begin
  AStream.Seek(0, 0);
  Result := TIcon.Create;
  Result.LoadFromStream(AStream);
  AStream.Free;
  AStream := nil;
end;

var
  AIcon: TIcon;
  AStream: TStream;
begin
  AIcon := TIcon.Create;
  AIcon.LoadFromFile('C:\test.ico');
  AStream := WriteIconToStream(AIcon);

  AIcon := ReadIconFromStream(AStream);
  self.Canvas.Draw(150, 150, AIcon);
end.


lg. Astat

patti 18. Feb 2010 09:35

Re: Großes Icon in Stream speichern
 
Hi Astat,

erstmal danke für deine Antwort. Leider trifft das mein Problem nicht genau. Hätte in meinem ersten Post vermutlich noch verdeutlichen sollen, dass ich eigentlich mehrere Icons (zusammen mit anderen Daten) in einen Stream speichern will. Der letzte Quelltext-Ausschnitt oben war nur ein Beispiel, in Wirklichkeit sollen wie gesagt mehrere Daten hintereinander geschrieben werden. Dein Quelltext schreibt bzw. liest ja jeweils nur ein Icon in den / aus dem Stream. Sorry, hab mich da wohl etwas falsch ausgedrückt.

Trotzdem danke nochmal für deine Bemühungen ;-)

mfg

sx2008 18. Feb 2010 09:50

Re: Großes Icon in Stream speichern
 
Du solltest vielleicht deine Icons hochladen.

In deinem Stream kommt zuerst die Länge und danach die Nutzdaten (das Icon).
Dein Gesamtstream sieht ungefähr so aus (L=Länge, x,y,&z=Nutzdaten):
Code:
LLLLxxxxxxxxxxxxxxxxxxxLLLLyyyyyyyyyyyyyyyyyyyLLLLzzzzzzzzzzzzzzzzzz
Sind nun x,y & z immer nur Icons oder kann das auch etwas anderes sein?
Falls es auch andere Daten sind, dann sollte zusätzlich zur Längenangabe auch eine Datentypangabe im Stream vorhanden sein.

Ansonsten; hast du mal versucht den MemoryStream innerhalb procedure ReadIconFromStream wieder in eine Datei zu speichern?
Und dann einen Binärvergleich mit der orginalen Icondatei durchführen.

patti 18. Feb 2010 10:15

Re: Großes Icon in Stream speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
"x, y & z" sind verschiedene Daten (Icons, Strings, ...). Mein Stream ist genauso aufgebaut, wie du es beschrieben hast. Auf die Datentypangabe kann ich in meinem Fall jedoch verzichten, da ich immer weiß, welche Daten als nächstes im Stream kommen müssen. Es handelt sich um eine ObjectList mit Objekten einer Klasse, die sich alle nacheinander in den Stream speichern, wobei jeder Speicher- bzw. Lese-Vorgang aller Objekte exakt gleich abläuft.
Bin inzwischen der Meinung, dass das Problem in der Icon-Klasse liegt. Hab mit einem Icon-Editor ein Icon erstellt, welches nur die Auflösung 256x256 enthält. Wenn ich dieses mit Icon.LoadFromFile versuche zu öffnen und auf die Canvas meiner Form zeichnen will, erhalte ich exakt die gleiche Fehlermeldung wie oben beschrieben. Hab das Icon mal in den Anhang, vielleicht kann das ja mal jemand testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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