Einzelnen Beitrag anzeigen

heiopei
(Gast)

n/a Beiträge
 
#1

Bitmap mit Zlib speichern und laden

  Alt 21. Jun 2006, 10:37
hallo,
ich möchte in einen Filestream meine Daten schreiben, darunter wie der Titel schon sagt auch Bilder.
Um die Größe der Datei zu verringern verwende ich die ZLibEx-Unit (Zlib 1.2.3). Wenn ich meine Daten ohne Bilder speichere und dann lade, funktioniert das ganze.

Wenn ich jetzt aber auch Bilder speichere, dann kommt beim Laden immer eine AV! Ich hab hier im Forum nur den Hinweis gelesen, dass angeblich LoadFromStream bis zum Ende des Streams ließt. Wenn dem so wäre, ist natürlich klar worans liegt ...

hier mal mein Code:

Delphi-Quellcode:
procedure Speichere(const DateiName: string);
var
  Datei: TFileStream;
  Zipper: TZCompressionStream;
  Grafik: TGraphic;
begin
  //... Fehlerüberprüfungen
  try
    //Datei erzeugen, bzw. leeren
    Datei := TFileStream.Create(Dateiname, fmCreate, fmShareExclusive)
    //Zipper erzeugen und mit "Datei" verknüpfen
    Zipper := TZCompressionStream.Create(Datei, zcMax);
    try
      //... Infos und Anzahl der gespeicherten Bilder schreiben
      for b := 1 to AnzahlBilder do
      try
        Grafik := TBitmap.Create;
        with Grafik as TBitmap do
        begin
          LoadFromFile(GrafikPfad[b - 1]);
          SaveToStream(Zipper);
        end;
      finally
        FreeAndNil(Grafik);
      end;
    except
      //... Fehlerbehandlung
    end;
  finally
    //Zipper wieder freigeben
    FreeAndNil(Zipper);
    //Datei wieder freigeben
    FreeAndNil(Datei);
  end;
end;

procedure Lade(const DateiName: string);
var
  Datei: TFileStream;
  EntZipper: TZDecompressionStream;
begin
  try
    //Datei zum Lesen öffnen
    Datei := TFileStream.Create(Dateiname, fmOpenRead, fmShareExclusive)
    //EntZipper erzeugen und mit "Datei" verknüpfen
    EntZipper := TZDecompressionStream.Create(Datei);
    try
      //... Infos und Anzahl der gespeicherten Bilder auslesen
      for b := 1 to AnzahlBilder do
      begin
        Grafiken[b - 1] := TBitmap.Create;
        with (Grafiken[b - 1] as TBitmap) do
          LoadFromStream(EntZipper); //<--- HIER DER FEHLER!!!
      end;
    except
      //... Fehlerbehandlung
    end;
  finally
    //EntZipper wieder freigeben
    FreeAndNil(EntZipper);
    //Datei wieder freigeben
    FreeAndNil(Datei);
  end;
end;

end.
ps: ich hab den code auf das Wesentliche reduziert, das sollte auch die case-schleife und die
Verwendung von TGraphic statt TBitmap erklären...
pps: die anderen Werte schreibe ich mit Zipper.Read(Variable, SizeOf(Variable)) und lese sie so auch
wieder
  Mit Zitat antworten Zitat