Run Length für Bitmaps

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Hallo, ich habe gerade Run Length geschrieben, jetzt stellt sich folgendes Problem dar, ich habe eine Datei die ist 723kB groß. Wenn ich diese jetzt kodiere wird sie nicht kleiner sondern größer und zwar 734 kB. Wenn ich diese dan dekodiere wird sie wieder 723kB groß und stimmt mit der Ausgangsdatei überein.
Das ist der Code --> http://paste.pocoo.org/show/138038/

Also wenn ich andere Bitmaps kodiere wird die Datei ja kleiner aber nur bei der einen nicht. Woran könnte das liegen?

Gibt es hier vielleicht die Möglichkeit die Datei hochzuladen? Weil vieleicht könnt ihr euch das dan besser vorstellen.

Würde mich über Hilfe sehr freuen.

MfG cz3kit
Haben wir mal wieder was gelernt :P
BlackJack

@cz3kit: Wenn keine "runs" existieren, kann es halt auch nicht kleiner werden. Und wenn dann noch Markerbytes in den Ausgangsdaten vorkommen, dann wird es grösser.

Das man nicht jede Datei verkleinern kann, sollte ja eigentlich klar sein.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Hier findet man eine gute Erklärung zu dem, was blackjack geschriebenen hat.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ein paar Kleinigkeiten, die mir beim Überfliegen aufgefallen sind:
  • Code: Alles auswählen

    with open("kirby.bmp", "rb") as bitmap:
    Die Zeilen 41, 42, 67 und 68 können dann entfallen.

    marker ist eine Konstante und sollte deshalb MARKER heißen und am Script-Anfang definiert werden. Das würde sich auch für die Dateinamen anbieten.

    chr(0xFF) entspricht '\xFF'.

    Zeile 7 und 8

    Code: Alles auswählen

    last = char = bitmap.read(1)

    Code: Alles auswählen

    ord(last) == 255
    entspricht

    Code: Alles auswählen

    last == '\xFF'
    In Zeile 29 und 60 _ statt i, da i nicht benötigt wird.

    In Python-Versionen < 3 lieber xrange als range.
MfG
HWK
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Danke für die Tipps. Ich weiß jetzt woran es lag, dass die kodierete Datei größer wurde als die Ausgangsdatei. Es lang ganz einfach an dem Marker. Ich habe den MArker mal auf 0x90 gesetzt und damit habe ich wurde dann die kodierte Datei kleiner als die Ausgangsdatei.

MfG
cz3kit
Haben wir mal wieder was gelernt :P
BlackJack

@cz3kit: Damit hast Du das Problem aber nur auf den neuen Marker verschoben.
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

Ja schon aber das zeichen 0x90 kommt selterner vor als das Zeichen 0xFF. Man müsste dan am Ende eh überprüfen ob die kodierte dabei größer wird als die Ausgangsdatei, um den User zu sagen ob es Sinn hat die Datei zu kodieren oder net :P
Haben wir mal wieder was gelernt :P
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Die Zeilen 24 bis 36 lassen sich noch zusammenfassen:

Code: Alles auswählen

            else:
                code = MARKER + '\x00' if last == MARKER else last
                for _ in xrange(counter):
                    rled.write(code)
MfG
HWK
Antworten