Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 241738 (3174)
  Suchen
Seiten: 1 2Zurück zur Übersicht
 AutorThema: Kompression
Martin Pohl
Datum:21.09.02 22:43 Antwortenals Email verschicken (martin_pohl@msn.com) 


Hallo!

Ich möchte gerne mein eigenes ZIP-Format erstellen. Jedoch habe ich noch keinen richtigen Plan, wie die Daten komprimiert werden soll. Könnt ihr mir vielleicht ein paar Tipps geben, wie ich die Dateien am besten komprimieren kann?

Profan² 5.0 - Windows XP Professional


Frank Abbing
Datum:21.09.02 23:06 Antwortenals Email verschicken  


Hallo.

Da ich selber gerade dabei bin, eine zweite Komprimierungs-Methode in die ProSpeed.dll einzubauen, will ich mal versuchen dir das zu beschreiben.
Es gibt zwei gängige Methoden (es gibt mehr, die anderen sind aber arg kompliziert), einmal die Längencodierung und einmal die Huffman-Codierung.

Huffman ist höchst effizient, besonders bei Texten. Nachteil: Die Codierung ist ziemlich kompliziert (merke ich gerade selber) und zeitaufwendig.

Die Längencodierung ist effizient, speziell bei Grafikdateien (Bmp) und dabei sehr simpel. Hierbei werden verschiedene oft hintereinander vorkommende Bytes gebündelt und dabei codiert, in folgenden Schritten:

Aus...

0,0,0,0,0,78,78,78,78,78,78,78,78,78,78,78 (16 Bytes)

wird...

111,5,0,111,7,78 (6 bytes)

1) Das Byte suchen, das am seltensten vorkommt. Das wird unser Markierbyte. Im Beispiel oben wäre das z.B. 111
2) Im zu durchsuchenden Speicherbereich Byte für Byte durchgehen, wenn mehr als drei gleiche Bytes gefunden werden (z.B. 5 Nullen), dann zuerst Markierbyte setzen, Anzahl gleicher Bytes setzen und das Byte selber setzen.
3) 2) wiederholen, bis alle Bytes durchsucht sind.

Fertig.

Wenn aber wirklich mal das byte 111 gefunden wird, mußt du schreiben: 111,1,111, bzw: bei mehreren hintereinaderfolgenden Bytes (z.B.8): 111,8,111

Ziemlich simpel, oder?
Allerdings kannst du Bmp Bilder noch besser Komprimieren, wenn du sie vorher anders strukturierst, weil immer abwechselnd Rot, Grün und Blau Anteile in der Datei vorkommen: Besser wäre zuerst alle Roten dann alle Grüne und dann alle Blauen. In der ProSpeed.dll können Bmp's durch einen speziellen Parameter zuerst so verändert werden und erst dann gepackt werden. ProSpeed's Komprimierungs-Funktion erreicht Packraten von Durchschnittlich 40%, bei Bmp-Dateien bis zu 60%.

Daten in reinem Profan zu komprimieren ist meiner Meinung nach von der Geschwindigkeit nicht akzeptabel.

Gruß, Frank



Martin Pohl
Datum:22.09.02 09:47 Antwortenals Email verschicken (martin_pohl@msn.com) 


Ok, danke Frank!

Es ist zwar nicht wirklich leicht verständlich. Aber ich denke, wenn ich mir das 10mal durchlese werde ich kapiert haben, was du da geschrieben hast. Mal sehen, was ich daraus machen kann.


Martin Pohl
Datum:22.09.02 09:53 Antwortenals Email verschicken (martin_pohl@msn.com) 


Eine Frage habe ich nochmal zu Bitmaps:

Werden bei Bitmaps die RGB Werte so gespeichert:
R,G,B,R,G,B,R,G,B,...

Oder so:
R,R,R,R,G,G,G,G,B,B,B,B,...


Frank Abbing
Datum:22.09.02 14:13 Antwortenals Email verschicken  


Hallo,

hab' nochmal genau nachgesehen.
Sie wird so gespeichert:
B,G,R,B,G,R,B,G,R,...

Gruß, Frank


Martin Pohl
Datum:22.09.02 17:19 Antwortenals Email verschicken (martin_pohl@msn.com) 


Frank, wärst du bitte so freundlich und würdest mir ein einfache Prozedur schreiben, mit der ich eine Datei komprimieren und speichern kann? Hier habe ich schone etwas angefangen:

Proc Komprimieren
Parameters Datei$,Save$
Declare Last%,Nummer%,Groesse%,Bytes%
Let Groesse%=@FileSize(Datei$)
Assign #1,Datei$
Assign #2,Save$
OpenRW #1
OpenRW #2
While @NEq(@Add(1,@FilePos(#1)),Groesse%)
Let Nummer%=1
Let Last%=@GetByte(#1)
While @Equ(Last%,@GetByte(#1))
Inc Nummer%
EndWhile
PutByte #2,Nummer%
PutByte #2,Last%
Seek #1,@Sub(@FilePos(#1),1)
PB_Modern %Hwnd,4,76,392,18,@Div(@Mul(100,@FilePos(#1)),Groesse%)
EndWhile
CloseRW #1
CloseRW #2
PB_Modern %HWnd,4,76,392,18,100
MessageBox "Komprimierung abgeschlossen","Fertig",0
PB_Modern %HWnd,4,76,392,18,0
EndProc


Das funktioniert nicht richtig. Die Dateien werden eher größer statt kleiner.

Profan² 5.0 - Windows XP Professional


Frank Abbing
Datum:22.09.02 20:00 Antwortenals Email verschicken  


Hallo Martin,

ich habe mit Profan bisher keine Komprimierungs-Prozedure geschrieben, deshalb kann ich dir auch keine anbieten.
Deinen Code konnte ich auch nicht testen, weil mein Profan diese Prozedur nicht kennt:

PB_Modern %HWnd,4,76,392,18,100

Und ein Tipp. Komprimiere die Datei im Speicher und speichere sie dann später komplett. Wenn Profan immer zwischen zwei Dateien lesen/schreiben muß, benötigt das unglaublich viel Zeit.

Die Komprimierungsfunktion, die ich geschrieben habe, befindet sich in der ProSpeed.dll und ist in Assembler programmiert. Du kannst sie von deinem Profan-Programm natürlich nutzen und sie arbeitet ca. innerhalb einer Millisekunde pro Megabyte.

Gruß, Frank


Martin Pohl
Datum:22.09.02 20:54 Antwortenals Email verschicken (martin_pohl@msn.com) 


Die Prozedur PB_Modern ist in meiner ProgBar.inc enthalten. Das kannst du auskommentieren. Wie meinst du das mit im Speicher komprimieren? Soll alle Bytes im Speicher lassen und dann am Ende in eine Datei schreiben? Wie soll ich das denn Zwischenspeichern mit Profan² 5.0? Obwohl, ich kann ja Arrays verwenden.

Das das langsam ist stimmt. Für eine Datei von knapp 250 KB benötigt das Einlesen rund 1 Minute. Was passiert denn erst, wenn man Filme von 600 MB komprimieren möchte? Das im Speicher ist ne gute Idee.


Frank Abbing
Datum:22.09.02 21:22 Antwortenals Email verschicken  


Hallo,

benutze lieber Bereiche anstatt Array's.

Gruß, Frank


Thorsten
Datum:23.09.02 08:42 Antwortenals Email verschicken (galaxy@mrk-soft.de) 


Hallo,

auch wenn es jetzt "Grass" klingt, lass es: Mit Profan ist
das ganze einfach zu langsamm. Für rund 1 MB brauchte immer
rund 1 Minute oder sogar mehr.

Nutz lieder die ProSpeed.DLL oder einen anderen Windows (Zip)
Packer, die in Assembler oder C++ geschrieben sind.




Sven Schmidts
Datum:23.09.02 09:33 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Eigene Komprimierungsformate scheinen derzeit hoch im Kurs zu stehen ... Nichts für ungut, Martin, dass kannst Du knicken. Du schaffst es definitiv nicht, mit Profan eigenen Mitteln eine einigermassen sinnvolle Komprimierung hinzubekommen. Ansonsten kann ich Dir gerne den Sourcecode der offenen Delphi-Komponenten, die ZIP kompatibel sind, zusenden. Vorab viel Spass damit ;)

Davon abgesehen ist die Komprimierung ein äußerst komplexes, hoch-mathematisches Thema und neben Kryptografie sehr "beliebt" bei Informatik-Studenten. Ich denke, Du solltest lieber z.B. das WinRAR-Interface einbinden (die DLL), dass geht schneller, spart Dir eine Menge arbeit und ist 100% durchoptimiert.

Mfg.
Sven Schmidts


Martin Pohl
Datum:23.09.02 14:50 Antwortenals Email verschicken (martin_pohl@msn.com) 


1. Es soll nur zu Testzwecken sein, da reicht Profan² (später mache ich es vielleicht in Assmebler oder Delphi)

2. Die Dateien die ich komprimieren will, sind nur 20 KB groß.

3. Ich denke schon, dass ich eine gute Kompression hinkriegen würde, denn komplexe Dinge sind für mich noch recht einfach, im Vergleich zu anderen Leuten.


Frank Abbing
Datum:23.09.02 14:59 Antwortenals Email verschicken  


Hallo,

da ich jetzt die Huffman-Codierung soweit hinbekommen habe, kann ich dir folgendes sagen:

- Eine Längencode-Codierung in Profan wäre möglich, aber natürlich recht langsam. Sie erreicht Packraten von durchschnittlich 40-60 %. Grafiken werden am besten gepackt.

- Die Huffman-Codierung ist selbst in Assembler recht langsam. Die durchschnittliche Packrate liegt bei 20-50 %. Texte und Html-Texte werden am besten gepackt.

- Es gibt noch einige andere Komprimierungs-Mechanismen, die aber so komplex sind, das sie mit Profan nicht möglich sind.

Mein Fazit: Wenn du unbedingt via Profan packen willst, dann versuch dich an der Längencodierung. Die packt gut und ist sehr simpel.

Gruß, Frank


Martin Pohl
Datum:23.09.02 15:06 Antwortenals Email verschicken (martin_pohl@msn.com) 


Hallo, Sven!

Wäre nett, wenn du mir den Sourcecode zuschickst oder mir sagst, wo ich das Ding her kriege. Ist es für Delphi 6?


Sven Schmidts
Datum:23.09.02 15:15 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Gute Frage, auf der Delphi5 CD ist es im Ordner "\info\extras\zlib\"


Martin Pohl
Datum:23.09.02 15:18 Antwortenals Email verschicken (martin_pohl@msn.com) 


Kannst du es mir dann mal zuschicken, wenn es nicht zu groß ist (max 3 MB). Bei meiner Delphi-CD ist das nicht drauf.


Florian May
Datum:26.09.02 16:21 Antwortenals Email verschicken  


Es gibt auch ne möglichekiten text datein zu krombrimieren, auch mit rpofan, die datei oder die demo dazu heisst crypt und müsste in der link sammlung zu finden sein


Frank Abbing
Datum:26.09.02 16:50 Antwortenals Email verschicken  


Hi,

was, was, was ?
Ich kenne zwei Crypt Funktionen, eine in Thorsten Haggerts Crypt.dll und eine in meiner ProSpeed.dll.
Mit Komprimieren haben die aber gar nichts zu tun, nur mit Verschlüsseln von Daten/Texten...
Oder meinst du noch was anderes, dann poste bitte, wo genau es zu finden ist...

Gruß, Frank


Sven Schmidts
Datum:27.09.02 11:01 Antwortenals Email verschicken (schmidts@flat2serv.de) 


@Frank: PowerDLL's haben sowohl Crypt als auch ZIP, schon ewig. Ich denke, die meint er ;)


Florian May
Datum:27.09.02 18:48 Antwortenals Email verschicken  


ich meine die Crypt.dll......

ich habe mit dieser dll einzelne dateien kleiner gemacht, doch das pakcen wie man es von zip her kennt kann dies noch nicht.........


Seiten: 1 2Zurück zur Übersicht