Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

Pfiffiges Speicherformat für Punktlisten gesucht

  Alt 24. Aug 2009, 10:25
Aloah!

Ich kämpfe gerade damit Punktlisten möglichst platzsparend auf Platte zu bringen. Dabei zählt wirklich jedes Bit, da es letztlich um eine Kompression geht. Die Punktlisten beinhalten folgendes:
- Punkte (uh baby)
Jeder Punkt besteht dabei aus:
- Seine X und Y Koordinaten; Größenordnung 0..1000 im Regelfall (geht um Bilder, später evtl. Video-Frames bis hin zu Full HD)
- Einen 2D-Vektor (X, Y); Größenordnung -64..63; Das ist ein skalierter Normalenvektor eines Ursprungspfades
- Zwei Farben

Aus diesen Infos werden später 2 Pfade erzeugt, die quasi-parallel verlaufen (Punkt +/- Normalenvektor), wobei jeweils einer eine der 2 Farben pro Punkt abbekommt. Diese zwei Farben sind dabei meist sehr unterschiedlich, also hilft eine paarweise Differenzbildung hier denke ich kaum.

Folgendes habe ich schon getan:
Nur der erste Punkt wird mit vollen 32bit Koordinaten gepeichert, von da an nur noch die Differenzen zum vorigen Punkt. Da sicher gestellt ist, dass dieser in einem Radius von 63 Pixeln liegt, passen die Differenzkoordinaten in Signed-Bytes. Gleiches gilt für die Normalen. Diese ließen sich theoretisch auch auf -32..31 reduzieren, jedoch ist das Bit gewinn auf 2 Koordinaten schwer gewinnbringend einzusetzen, da ich dann 2-Bit-Verschiebungen bekäme die ausgesprochen "nasty" wären.
Den Farbwert hab ich mal als 24bit RGB genommen, aber auch mal ein YCC Format probiert, bei dem ich die beiden Farbkomponenten in ein Byte gequetscht hab. Da dies aber nur je 16 Abstufungen zulässt, war das Ergebnis nicht gerade brauchbar. 32 Abstufungen dagegen wären schon besser, aber ähnliches Problem wie vorher: 1 Bit mehr = ekelhafte Verschiebungen im kompletten Stream.

Folgliiich kam ich auf ca. diese Größenordnungen:
Fall 24bit RGB:
Erster Punkt 4+4+1+1+3+3=16 Bytes, jeder weitere Punkt 1+1+1+1+3+3=10 Byte. Bei einem 10-Punkte Pfad also z.B. 106 Byte.
Fall 16bit YCC:
Erster Punkt 4+4+1+1+2+2=14 Bytes, jeder weitere Punkt 1+1+1+1+2+2=8 Byte. Bei einem 10-Punkte Pfad also z.B. 86 Byte. Aber eben indiskutable Farbreduktion.
Jedem Pfad ist zudem ein 32bit Integer vorangestellt der die Länge der folgenden Daten in Bytes angibt um mehrere solcher Listen voneinander trennen zu können. Mehrere Pfade haben keinerlei ausnutzbare Abhängigkeit voneinander.

Ich komme im Schnitt auf ca. 1000 Pfade á 10 Punkte, was im ersten Fall rund 107kB ergibt. Das ist mir zu viel! Zielgrößenordnung sollte irgendwo ab 50k bis 75k für eine solche Menge liegen, sehr gerne auch weniger.

Ich kann wie gesagt durchaus auf eine Qualitätsreduktion bei den Farben eingehen, nicht aber so wie in meinem Versuch. Auch ist 100%ige Pixelgenauigkeit nicht erforderlich. So ein Punkt kann gern auch mal 1-2 Pixel daneben liegen, es sollte im Großen und Ganzen aber nicht zu arg werden.

Hat hier noch jemand einen supergenialen Einfall wie ich das noch weiter zusammenstauchen könnte, oder bin ich auf verlorenem Posten?

Heissen Dank im Voraus!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat