RLE verständnisfrage

#3966891
Lesenswert?

Hallo zusammen

Ich möchte Daten mittels RLE etwas komprimieren.
Nun versuche ich dazu, einen Algorithmus zu schreiben welcher mir ein 
Array mit Bytes mittels RLE komprimiert.

Dazu habe ich folgende Seite gefunden:

http://www.gabotronics.com/tutorials/run-length-encoding-for-lcd.htm

Dort wird das vorgehen eigentlich gut beschrieben:

- Nimm zwei bytes
- sind diese gleich?
--> Ja:
 gib beide aus
 zähle wie oft die gleichen bytes kommen.
 gib diesen wert aus
 nimm wieder zwei bytes... prüfe...
--> Nein:
 ...

Nun die struktur ist dann folgende:

0x01 0x04 0x05 0x05 0x07

Folgend zweimal die gleichen Bytes aufeinander, so beschreibt das dritte 
wie oft das vorangegangene nun kommt.

Bsp: 0x05 0x05 0x07
An dieser stelle kommt nun 7mal ein 0x05

0x01 0x04
Hier steht tatsächlich nur 0x01 und 0x04

Soweit so gut...
Was ist nun aber, wenn ein byte mehr als 255 mal aufeinander folgt?

Wie sieht es dann aus?
#3966970
Lesenswert?

Schlaumeier schrieb:
> 0x05 0x05 0x00

Sowas kann nicht vorkommen in einer RLE komprimierten Datei...

Schlaumeier schrieb:
> 0x05 0x05 0x01

Dies ebenfalls nicht.

Da dies bedeuten würde das 0x05 einmal vorkommt.

Dan würde jdeoch einfach nur 0x05 stehen...


Kannst du deine Idee etwas genauer erläutern?

holger schrieb:
> Dann machste halt zwei Häppchen draus. Was anderes
> bleibt doch gar nicht über.

Perfekt!
#3967005
Lesenswert?

Du kannst da ganz nach Belieben dein eigenes Süppchen kochen.

0x05 0x05 0x00

macht ja eigentlich keinen Sinn, könnte aber eine Sonderbedeutung 
einnehmen.
Könnte z.B. heissen, 0x05 kommt öfter als 255 mal hintereinander.
Und wie oft steht dann z.B. im nachfolgenden 16-bit Wert.

0x05 0x05 0x00 0x20 0x22
hiesse dann also, dass 0x05 0x2022 (8226) mal wiederholt wird...

und
0x05 0x05 0x01 0xff 0xff 0xff 0xff
könnte z.B. für 4 Gigabytes 0x05 stehen...
Gast #3967011
Lesenswert?

Holger Krähenbühl schrieb:
> Sowas kann nicht vorkommen in einer RLE komprimierten Datei...

In der Variante wie du es beschrieben hast nicht. Aber wenn das 
Protokoll noch nicht fest steht (weil du Einfluss auf Encoder und 
Decoder hast), kannst das das ausnutzen, um noch besser zu komprimieren: 
Dann bedeutet der Wiederholungszähler=n nicht n mal wiederholen, sondern 
n+2 mal wiederholen. Damit kannst du die Brocken um 2 bytes länger 
machen, und wenns gut läuft brauchst du am Ende weniger Brocken.
#3967030
Lesenswert?

Übrigens kann es sich lohnen, darüber nachzudenken, welche Daten man zu 
komprimieren hat.
Beispiel: es handelt sich um Bilddaten im RGB 5:6:5 Format. Da hat jedes 
Pixel 16 bit.
Eine grüne Linie oder Fläche sähe z.B. so aus:

0x07E0 0x07E0 0x07E0 0x07E0 0x07E0 (...)

Byteweise mit obigem Algorithmus nicht zu komprimieren, da keine 
gleichen Bytes aufeinanderfolgen.
Als 16-bit Werte betrachtet allerdings schon...
#3967061
Lesenswert?

Joe F. schrieb:
> Byteweise mit obigem Algorithmus nicht zu komprimieren, da keine
> gleichen Bytes aufeinanderfolgen.
> Als 16-bit Werte betrachtet allerdings schon...

Vielen Dank für deinen Hinweis!
Gefällt mir sehr gut!

Es handelt sich bei meinen Daten in der Tat um BMPs im RGB 565 Format.

Dazu muss ich allerdings erstmal den BMP Header auslesen um zu wissen, 
ab wo die eigentlichen Daten beginnen.

Den Header kann ich ja dann als 8bit RLE kodieren.
Dazu könnte ich im ersten byte die Startposition der 16bit RLE Daten 
definieren.
Gast #3968586
Lesenswert?

Joe F. schrieb:
> angenommen das ganze bild ist eine einzige farbflaeche, dann ergibt
> zeilenweises xor doch lauter nullen. wie kommst du denn dann auf die
> urspruengliche information zurueck?

Naja, die erste Zeile muss man schon ungeXored speichern (gäbe ja auch 
keine vorhergehende Zeile mit der man verknüpfen könnte). Dann schaut 
das so aus:

Originalbild:
1
01 02 01 02 01 02
2
01 02 01 02 01 02
3
01 02 01 02 01 02
4
01 02 01 02 01 02

Sukzessive EOR-Verknüpfung der Zeilen mit der jeweils diekt 
darüberliegenden Zeile:
1
01 02 01 02 01 02   01 02 01 02 01 02   01 02 01 02 01 02
2
01 02 01 02 01 02   01 02 01 02 01 02   00 00 00 00 00 00 
3
01 02 01 02 01 02   00 00 00 00 00 00   00 00 00 00 00 00
4
00 00 00 00 00 00   00 00 00 00 00 00   00 00 00 00 00 00

Beim entpacken läuft's halt andersherum:
1
01 02 01 02 01 02   01 02 01 02 01 02   01 02 01 02 01 02    usw.
2
00 00 00 00 00 00   01 02 01 02 01 02   01 02 01 02 01 02
3
00 00 00 00 00 00   00 00 00 00 00 00   01 02 01 02 01 02
4
00 00 00 00 00 00   00 00 00 00 00 00   00 00 00 00 00 00

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren