| Autor |
Beitrag |
Jazzalex
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 11:11
Hi an alle,
eigentlich wohl nicht das Riesenthema, aber ich verzweifle im Moment dran : Speichern und Laden von Bitmaps via TFileStream. Der folgende Code lädt ein Bitmap, speichert es x mal in einem Array ab und prüft durch anschließendes Laden und Darstellen in Image1, ob das Bitmap auch tatsächlich gespeichert wurde. Dummerweise bekomme ich den folgenden Error :
Bitmpap Image is not valid
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| var
images : array [0..20] of TBitmap; f2 : TFileStream; pic : TBitmap;
implementation
f2 := TFileStream.Create('images.tst',fmCreate); pic := TBitmap.Create(); pic.LoadFromFile(OpenDialog1.FileName);
for i := 1 to 5 do images[i-1] := TBitmap.Create; images[i-1].assign(pic); f2.seek(i-1,soFromBeginning); images[i-1].SaveToStream(f2); end;
for i := 1 to 5 do begin f2.seek(i-1,soFromBeginning); images[i-1].LoadFromStream(f2); end; |
Image1.Picture.assign(images[3]);
Weiß jemand, was noch falsch ist ?
Danke
-- A l e x
P.S.: Wie kann ich meinen Code hier entsprechend formatieren ?
Moderiert von UGrohne: Delphi-Tags hinzugefügt.
|
|
n-regen
      
Beiträge: 202
Erhaltene Danke: 2
|
Verfasst: Di 22.08.06 11:14
1. Ich kapiers auch nicht.
2. Du klickst auf Bereiche, dann das + hinter Delphi.
Es erscheint "delphi" in eckigen Klammern.
Du tippst den Quelltext ein und klickst Delphi*.
Es erscheint "[/delphi]" und der QT-Bereich ist fertig.
Lässt sich mehrmals pro Post anwenden.
|
|
Jazzalex 
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 12:19
es scheint so, als würde er den seek-command nicht mögen. Im Moment sieht's besser aus. Bald mehr.
-- A l e x
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.08.06 12:26
Moin!
Du überschreibst da ja wieder deine Daten...
Probier das mal so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| var images : array [0..20] of TBitmap; f2 : TFileStream; pic : TBitmap;
implementation f2 := TFileStream.Create('images.tst',fmCreate); pic := TBitmap.Create(); pic.LoadFromFile(OpenDialog1.FileName);
f2.seek(0,soFromBeginning); for i := 1 to 5 do images[i-1] := TBitmap.Create; images[i-1].assign(pic); images[i-1].SaveToStream(f2); end;
f2.seek(0,soFromBeginning); for i := 1 to 5 do images[i-1].LoadFromStream(f2); |
Erläuterung: Mit .Seek kannst du die Schreib-/Leseposition im Stream verschieben, aber byteweise! Fazit: mit .Seek kannst du nicht an die Position eines beliebigen Images im Stream "laufen", dazu müßtest du wissen, wie groß jedes Image in Bytes ist!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jazzalex 
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 12:44
Hi - super, nun funktioniert es. Der nächste Schritt ist der, daß ich einen Record habe, der ein TBitmap enthält. Ensprechend habe ich den Code angepaßt :
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| type Datentyp = RECORD
bitmap : TBitmap;
xpos : integer;
ypos : integer;
up : integer;
down : integer;
left : integer;
right : integer;
END;
var
Daten : array[0..20] of Datentyp;
f2 : TFileStream;
implementation
f2 := TFileStream.Create('images',fmCreate);
f2.seek(0,soFromBeginning);
for i := 1 to 20 do
begin
Daten[i-1].bitmap := TBitmap.Create;
Daten[i-1].bitmap.LoadFromFile(OpenDialog1.FileName);
f2.write(Daten[i-1],sizeof(Daten));
Daten[i-1].bitmap.Assign(Image2.picture.Bitmap); end;
f2.seek(0,soFromBeginning);
for i := 1 to 20 do
begin
f2.read(Daten[i-1],sizeof(Daten));
end;
Image20.Picture.assign(Daten[3].bitmap); |
Leider funktioniert dies noch nicht - es wird nur das Defaultbild angezeigt - sprich das Image wird nicht aus dem File geladen. Siginificante Änderung ist im Moment, daß ich anstatt TBitmap.SaveToStream nun den f2.write bzw. read-Befehl benutze. Ich hier die Angabe von sizeof(Daten) richtig bzw. mache ich etwas anderes falsch ?
Grüsse
-- A l e x
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.08.06 12:47
Moin!
Hehe, ich wußte es...
Schau mal hier, geht da zwar um Netzwerkdatenübertragung, aber ein (File)Stream ist ja praktisch nix anderes, das Grundproblem ist das gleich.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jazzalex 
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 13:18
Yo, das sieht in der Tat alles dem Problem ähnlich, was hier gerade parallel diskutiert wird
OK - danke, Mann - ich habe mir Deinen FAQ-Bericht durchgelesen. Nur um Sicher zu gehen : Obwohl ich es mit einer ganz profanen Datei-Lese-Schreib-Geschichte zu tun habe, empfiehlst Du mir, PROTOCOLL anstatt RECORD zu nehmen, richtig ?
Cheers
-- A l e x
|
|
Jazzalex 
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 13:27
noch ein Problem : Habe in meiner HELP nach PROTOCOL gesucht und nix gefunden (Nutze Delphi 5).
und eine Anmerkung : Die Bitmaps in meinem Record sind alle absolut gleich groß, also keine Dynamik.
Es sollte doch wohl möglich sein, diesen Record so abzuspeichern, oder täusche ich mich da ?
-- A l e x
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 22.08.06 13:42
Moin!
Jazzalex hat folgendes geschrieben: | | noch ein Problem : Habe in meiner HELP nach PROTOCOL gesucht und nix gefunden (Nutze Delphi 5). |
 Öhm, das ist kein Delphi-Schlüsselwort, das ist eine prinzipielle Vorgehensweise.  Also quasi eine Idee...
Jazzalex hat folgendes geschrieben: | | und eine Anmerkung : Die Bitmaps in meinem Record sind alle absolut gleich groß, also keine Dynamik. |
In diesem Fall würde ich dir raten, dich mal mit TImageList zu beschäftigen. Da gibts dann auch die Möglichkeit, alles Images in einem großen Image zu laden und zu speichern.
Ansonsten kann du, wenn du die Größe eines Images in Bytes kennst, doch mit Seek arbeiten, dann ist das doch nur eine einfache Multiplikation.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Jazzalex 
      
Beiträge: 25
Fedora Core 3, Winx XP
|
Verfasst: Di 22.08.06 16:47
Narses hat folgendes geschrieben: | Moin!
Jazzalex hat folgendes geschrieben: | | noch ein Problem : Habe in meiner HELP nach PROTOCOL gesucht und nix gefunden (Nutze Delphi 5). |
Öhm, das ist kein Delphi-Schlüsselwort, das ist eine prinzipielle Vorgehensweise. Also quasi eine Idee...
|
Hehe - schönes Mißverständnis. Ich nutze selbst natürlich prinzipiell Protokolle, da war mir nicht klar, daß Du explizit dazu aufforderst  Hab' dann gedacht, Du hättest den ultimativen Recordersatz namens "Protocol" zur Hand, wenngleich es mir schon etwas seltsam vorkam
Nichts desto trotz ist mir die Problematik klargeworden, und mittlerweile speichere ich in meinem Record und dem entsprechenden File nicht mehr das TBitmap, sondern die einzelnen Pixel des Bitmaps ab und kann es somit wunderbar rekonstruieren.
Danke für die Hilfe,
auf mehr
-- A l e x
|
|
Masterhawk
      
Beiträge: 92
Win 2000,Win XP
D6 Pers
|
Verfasst: Di 22.08.06 16:57
He he he, thx...diesen Thread kann ich auch gut gebrauchen...
|
|