AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ordentliche Komprimierungsunit

Ein Thema von GreenHorn3600 · begonnen am 13. Aug 2009 · letzter Beitrag vom 18. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23      
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#1

Ordentliche Komprimierungsunit

  Alt 13. Aug 2009, 23:09
Hallo Wissende,

wollte mal fragen, ob jemand von euch eine ordentlche Komprimierungsunit hat, welche man sowohl in kommerziellen als auch in OS Projekten einsetzen darf.

Die ZLib funktioniert ja halbwegs, schafft schon mal 2°/oo an Komprimierung oder vergrössert gleich um 100% beim komprimieren . Wenn man dann die Datei mit einem HexEditor ansieht, sieht sie unverändert aus. Also scheint sie wohl nicht so das richtige zu sein.

Aber vielleicht kennt ja einer von euch, da was Sinnvolles

Schöne Grüße
Greeny
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ordentliche Komprimierungsunit

  Alt 13. Aug 2009, 23:23
Zitat von GreenHorn3600:
Die ZLib funktioniert ja halbwegs, schafft schon mal 2°/oo an Komprimierung oder vergrössert gleich um 100% beim komprimieren . Wenn man dann die Datei mit einem HexEditor ansieht, sieht sie unverändert aus. Also scheint sie wohl nicht so das richtige zu sein.
Kann ich mir eigentlich nicht vorstellen. Deswegen bin ichmir ziemlich sicher, dass du da irgendwas falsch machst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#3

Re: Ordentliche Komprimierungsunit

  Alt 15. Aug 2009, 23:23
*push*

weiss keiner, wie man Streams ordentlich komprimieren kann? Wobei die Unit für Closed und OS geeignet sein sollte?

  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Ordentliche Komprimierungsunit

  Alt 15. Aug 2009, 23:46
ZLib.

Meinst du nicht auch, dass wenn sie der Maßen schlecht funktionieren würde, dass sich da nicht schon andere gemeldet hätten?

Du kannst jetzt entweder weiter nach einer Alternative suchen oder du zeigst uns mal deinen Code und wir suchen deinen Fehler.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#5

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 00:12
Hallo Luckie,

dann mal viel Spass beim Suchen . Habe gerade ein kleines Testprojekt zusammengezimmert, sollte aber für einen Einblick genügen.

Edit: Update der Compremierungsroutine (Position := 0 vergessen)
Delphi-Quellcode:
procedure TForm2.Compress;
var
  zc: TZCompressionStream;
  ms1: TMemoryStream;
  buff: array [0..2048] of byte;
  len: integer;
begin
  ms1 := TMemoryStream.Create;
  try
   zc := TZCompressionStream.Create(ms1, zcMax);
   try
     ms.Position := 0;
     repeat
       len := ms.Read(buff, 2048);
       zc.Write(buff, len);
     until len <> 2048;
     lRateOfCompression.Caption := Format('%.3f', [zc.CompressionRate]);
     ms.Position := 0;
     ms.CopyFrom(ms1, ms1.Size);
   finally
      zc.free;
    end;
  finally
    ms1.Free;
  end;
end;
Grüße
das GreenHorn
Angehängte Dateien
Dateityp: pas unit2_157.pas (1,7 KB, 8x aufgerufen)
Dateityp: dfm unit2_823.dfm (1,9 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 00:25
Du musst den Zielstream (glaube ich) vor'm kopieren leeren, sonst behält der die alte Länge und wird höchstens länger.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.341 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 04:48
Das ist so, ja. Leeren oder die Größe danach auf die neue Größe setzen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
GreenHorn3600

Registriert seit: 24. Jun 2007
165 Beiträge
 
#8

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 09:01
Hallo Dax, Jänicke,

mhhh, ist nicht wirklich hilfreich. Wie ihr mit einem Blick auf den Code erkennen könnt, wird der Ausgabestream neu (also leer) erzeugt. Er wird ja auch prima gefüllt. Nur, ist dann der Inhalt reichlich unkomprimiert... Dies war ja auch meine Kritik dran, daher die Frage nach einer anderen, welche es besser kann. Übrigens, ein kleines Beispielprojekt ist angehangen, nur die Methode ist gegen die aktuelle hier aus dem obigen Post zu tauschen.

Greeny
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 11:09
Zitat von GreenHorn3600:
...Wie ihr mit einem Blick auf den Code erkennen könnt, wird der Ausgabestream neu (also leer) erzeugt...
Ich sehe nur das der MemoryStream erzeugt wird.
Ansonsten liest du aus einem anderem Stream (ms) und schreibst diesen in cz/ms1.
Anschließend kopierst du den komprimierten Stream an den Anfang des Streams aus dem du die ganze Zeit gelesen hast.
Ist dein unkomprimierter Stream also z.B. 5 MB groß und die komprimierten Daten sind 1 MB groß, so schreibst du diese 1 MB an den anfang des Ursprüngsstreams. Die restlichen 4 MB des Ursprungsstreams bleiben allerdings erhalten so das deine Datei weiterhin 5 MB groß ist. Welchen Sinn macht das?
Zudem verstehe ich deine Vorgehensweise mit der Schleife nicht. Warum verwendest du an dieser Stelle nicht bereits die CopyFrom-Methode?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Ordentliche Komprimierungsunit

  Alt 16. Aug 2009, 11:35
Hi Greeny,

Für dich dürfte es keine geeignete Kompressions-Unit geben. Du kannst nämlich mit egal welcher Klasse nicht richtig umgehen.
Bei mir funktioniert ZLib ganz prächtig, aber ich weiss auch, wie man die Library verwenden muss. Der Hauptfehler befindet sich übrigens in 99% der Fälle ca. 80cm vom Bildschirm entfernt und zeigt mit dem Finger auf andere.

Hier eine dezent korrigierte Version, sowie eine Alternative, die etwas kompakter ist, da sie den zu komprimierenden Stream einfach per CopyFrom direkt in ZLib reinbläst, anstatt sie in 2k-Happen zu komprimieren (Meine Unit kennt übrigens kein TZCompressionStream, vielleicht liegt es auch daran):
Delphi-Quellcode:
procedure TForm2.Compress;
var
  zc: TCompressionStream;
  ms1: TMemoryStream;
  buff: array[0..2048] of byte;
  len: integer;
begin
  ms1 := TMemoryStream.Create;
  ms.position := 0; // 1.Fehler, ms war am Ende und u.g. 'read' lieferte 0 bytes.
  try
    zc := TCompressionStream.Create(clMax, ms1);
    try
      repeat
        len := ms.Read(buff, 2048);
        zc.Write(buff, len);
      until len <> 2048;
      lRateOfCompression.Caption := Format('%.3f', [zc.CompressionRate]);
    finally
      zc.free; // 2.Fehler: Der ZCompressionStream hat noch Einiges im Puffer
    end;
    ms.clear; // 3.Fehler: Alten Stream löschen
    ms.CopyFrom(ms1, 0); // 4.Fehler: ms1 komplett von Anfang an kopieren
  finally
    ms1.Free;
  end;
end;

procedure TForm2.Compress1;
var
  zc: TCompressionStream;
  ms1: TMemoryStream;

begin
  ms1 := TMemoryStream.Create;
  try
    zc := TCompressionStream.Create(clMax, ms1);
    try
      zc.CopyFrom(ms, 0);
    finally
      zc.free;
    end;
    lRateOfCompression.Caption := Format('%.3f', [zc.CompressionRate]);
    ms.clear;
    ms.CopyFrom(ms1, 0);
  finally
    ms1.free;
  end;
end;
Bevor Du dich über meine Sticheleien echauffierst, bedenke, das Du dich sehr weit aus dem Fenster gelehnt hast und offenbar über eine gehörige Portion Selbstbewustsein verfügst, denn sonst würdest Du nicht allen Ernstes als 'GreenHorn' eine dermaßen erprobte Unit wie ZLib in Frage stellen. Soviel Chuzpe muss man erstmal haben

"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz