Autor Beitrag
Jazzalex
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: 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

ausblenden 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 user profile iconUGrohne: Delphi-Tags hinzugefügt.
n-regen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 22.08.06 12:26 
Moin!

Du überschreibst da ja wieder deine Daten... ;)

Probier das mal so:
ausblenden 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); // an den Anfang des Streams
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); // wieder an den Anfang des Streams
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: 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 :

ausblenden volle Höhe 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:
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)); // so richtig ?

    Daten[i-1].bitmap.Assign(Image2.picture.Bitmap); // Bitmaps mit defaultpic belegen
  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); // 4.Bitmap der Liste anzeigen


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 22.08.06 13:42 
Moin!

user profile iconJazzalex 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...

user profile iconJazzalex 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

Fedora Core 3, Winx XP

BeitragVerfasst: Di 22.08.06 16:47 
user profile iconNarses hat folgendes geschrieben:
Moin!

user profile iconJazzalex 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 92

Win 2000,Win XP
D6 Pers
BeitragVerfasst: Di 22.08.06 16:57 
He he he, thx...diesen Thread kann ich auch gut gebrauchen...