Einzelnen Beitrag anzeigen

Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Bitmap mit Zlib speichern und laden

  Alt 23. Jun 2006, 08:34
Sorry, dass ich mich erst so spät zurück melde

Beim ersten Post ist mir leider ein Flüchtigkeitsfehler unterlaufen.
Wie du schon bemerkt hast, musst du MemoryStream.CopyFrom(Entzipper, Groeße); nehmen.

Soweit ich das beurteilen kann müsste es theoretisch gehen.
Der Umweg über einen temporären Stream (MemoryStream) musst leider bei Verwendung
einen ZStreams gehen, da du eben nur immer kleine Stückchen aus dem gesammten liest.

Ich versuche nachher nochmal dein Problem bei mir im Delphi zu lösen,
wenn ich das weiterhin aus dem Kopf heraus versuche, könnte es kompliziert werden


[EDIT]

OK, das hat mich jetzt nicht losgelassen ^^

Ich hatte jetzt leider nur die Borland zLib, du musst also ab und zu die Parameter etwas angleichen.
Folgender Code funktioniert bei mir.

Delphi-Quellcode:
var MemStream: TMemoryStream; // oder FileStream, etc - zum Speichern & Lesen
    tmpMemStream: TMemoryStream; // zum arbeiten
    comStream: TCompressionStream;
    decomStream: TDecompressionStream;
    bmp: TBitmap; // Test-Bitmap
    Groesse: integer;
begin
  MemStream := TMemoryStream.Create;
  try
    bmp := TBitmap.Create;
    try
      bmp.Width := 250;
      bmp.Height := 250;
      
      // packen
      tmpMemStream := TMemoryStream.Create;
      try
        bmp.SaveToStream(tmpMemStream);
        Groesse := tmpMemStream.Size;
        comStream := TCompressionStream.Create(clDefault, MemStream);
        try
          comStream.Write(Groesse,sizeof(Groesse)); // Größe speichern
          comStream.CopyFrom(tmpMemStream,0); // Bitmap speichern
        finally
          comStream.Free; // Unbedingt nötig, bevor man weiterarbeitet! (Damit der Puffer des Streams 100%ig gespeichert)
        end;
      finally
        tmpMemStream.Free;
      end;
    finally
      bmp.Free;
    end;

    bmp := TBitmap.Create;
    try
      // entpacken
      MemStream.Position := 0;

      tmpMemStream := TMemoryStream.Create;
      try
        decomStream := TDecompressionStream.Create(MemStream);
        try
          decomStream.Read(Groesse,sizeof(Groesse)); // Größe lesen
          tmpMemStream.CopyFrom(decomStream,Groesse); // Bitmap entpacken
          tmpMemStream.Position := 0;
          bmp.LoadFromStream(tmpMemStream); // Bitmap laden
        finally
          decomStream.Free;
        end;
      finally
        tmpMemStream.Free;
      end;
    finally
      bmp.Free;
    end;
  finally
    MemStream.Free;
  end;
Manuel
  Mit Zitat antworten Zitat