Entwickler-Ecke

Dateizugriff - Bilder in Stream speichern und wieder auslesen


Furious_Dragon - Sa 05.09.09 23:13
Titel: Bilder in Stream speichern und wieder auslesen
Hallo

nachdem mir eben/ vorhin schon super geholfen wurde hab ich die Hoffnung das es jetzt wieder so super funktioniert.

Vorweg: ICH HABE DIE SUCHE BENUTZT ;) und habe auch ne ganze Menge gefunden nur leider nicht das was ich suche also wenn jemand hierzu den passenden Artikel kennt darf er mich auch gerne dahin verweisen!

Zu meinem Problem:
Ich würde gerne Bilder über einen Stream (über den auch eine ganze Menge andere Daten gespeichert werden) in eine Datei speichern.

Das erste Laden aus einer Bilddatei sieht in etwa so aus:
(e.Bild ist natürlich von TPicture)

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  bild:TPicture;
begin
  if(OpenPictureDialog1.Execute) then
  begin
    bild := TPicture.Create;
    bild.LoadFromFile(OpenPictureDialog1.FileName);
    Img_n_Bild.Picture := bild;
    e.Bild := bild;
  end;
end;



Beim speichern in den Stream komme ich nicht weiter... TPicture hat unter z.B. Bitmap Methoden wie SaveToStream nur leider unter Picture nicht wie kann ich also das Bild einfach in der Datei speichern?

Danke schonmal für eure Hilfe!


Furious_Dragon - Mo 07.09.09 11:09

Kennt sich keiner damit aus oder hab ich die Frage undklar gestellt?


jaenicke - Mo 07.09.09 22:18

Du wirst da schon nach Dateityp unterscheiden müssen, denn du musst ja beim Laden auch wieder das korrekt machen. Schließlich kann TPicture aus einem Stream den Dateityp nicht erkennen.

Also musst du selbst schauen, dann du nach Jpeg, Bitmap, ... unterscheidest und dementsprechend alles machen.


Sprint - Di 08.09.09 11:07

user profile iconFurious_Dragon hat folgendes geschrieben Zum zitierten Posting springen:
Beim speichern in den Stream komme ich nicht weiter... TPicture hat unter z.B. Bitmap Methoden wie SaveToStream nur leider unter Picture nicht wie kann ich also das Bild einfach in der Datei speichern?


TPicture.Graphic.SaveToStream


Furious_Dragon - Do 10.09.09 13:08

Also habs jetzt mit Graphic gemacht (scheint auch zu funktionieren - zumindest sagt mir die Dateigröße das etwas in der richtigen Größe geschrieben wurde) nur beim auslesen bekomm ich ein Fehler.

Delphi-Quelltext
1:
2:
          e.Bild := TPicture.Create;
          e.Bild.Graphic.LoadFromStream(stream);


hier bekomm ich eine EAccessViolation Exception Zugriffsverletzung beim Lesen von Adresse 0 woran kann das liegen?


jaenicke - Do 10.09.09 13:11

Weil Graphic noch gar nicht erzeugt wurde. Ich sagte ja oben schon: Woher soll denn die Komponente (ohne Dateierweiterung wie bei LoadFromFile) wissen was für ein Bild da in dem Stream liegt?!?
Du musst da schon die korrekte Klasse erzeugen (TBitmap, TJpegImage, ...) und dann damit den Stream laden.


Furious_Dragon - Do 10.09.09 13:21

Ahhh... jetzt hab ich es verstanden :idea:
OK funktioniert danke...


Furious_Dragon - So 13.09.09 23:51

Na toll was kann ich falsch gemacht haben?

Hab irgendwo irgendwas geändert im Programm bis vorhin hat alles soweit funktioniert und jetzt hab ich das Gefühl das er mit dem Stream durcheinander kommt.


zum Speichern nutze ich einfach die Methode SaveToStream von TPicture.Graphics

Delphi-Quelltext
1:
e.Bild.graphic.SaveToStream(Stream);                    


und ich lade das ganze wieder mit

Delphi-Quelltext
1:
2:
3:
e.Bild := Tpicture.Create;
e.Bild.Graphic := TJpegImage.Create;
e.Bild.Graphic.LoadFromStream(stream);


wenn ich das Bild über LoadFromStream geladen habe fängt er wieder am Anfang des Stream an also scheint irgendwas falsch zu laufen... Lief es vorher nur durch zufall? Hab ich irgendwo ein Fehler?


(Ich lade in das image ein jpeg File sollte dann doch richtig sein oder macht er intern doch wieder was von dem ich nichts weiß?)