von ABS » 08.11.2008, 15:25
Inzwischen habe ich es geschafft die RAW-Daten meiner IXUS 700 einzulesen. Die Weiterbearbeitung muss ich allerdings noch programmieren. Ich möchte hier nicht wieder Quellcode abtippen, sondern das grundsätzliche Vorgehen beschreiben (bitte berichtigen, falls noch etwas falsch ist):
1) Die Daten sind im Format Little-Endian in 2 Byte großen Blöcken gespeichert.
Wenn wir also den Anfang einer Datei betrachten, z.B. die ersten 6 Byte, sieht das ganze im Editor so aus:
B0 B1 B2 B3 B4 B5 (= von mir gewählter Name des Byte-Blocks zur Wiedererkennung unten)
C2 07 7C 10 07 00 (= (hex) Wert der Byte, der im Editor steht)
Daraus kann man aber noch nicht direkt die Werte der Farben berechnen
2). Man muss Byte-Blocke noch so tauschen:
B1 B0 B3 B2 B5 B4
07 C2 10 7C 00 08
Diese Sortierung entspricht nun der Sortierung wie man sie aus dem Leben kennt:
Die großen Werte einer Zahl kommen zuerst (links), die kleineste Einheit einer Zahl ist die letzte.
3) Die Byte-Folge ist jetzt noch im 8Bit-Modus gespeichert( z.B. (hex) C2 = (binär) 1100 0010)
Die Kamera speichert allerdings 10Bit-Daten. D.h. die 10-Bit Daten müssen aus den Binärdaten unter 2) extrahiert werden. Dazu schreibe ich jetzt mal die Daten aus 2) in binärer Form:
0 7 C 2 1 0 7 C 0 0 0 8 => (binär) 0000 0111 1100 0010 0001 0000 0111 1100 0010 0000 0000 0111
Jetzt kann man die Binärfolge auch so schreiben, dass ein Leerzeichen erst nach 10 Einträgen und nicht nach 4 Einträgen kommt:
0000011111 0000100001 0000011111 0000100000 00000111..
Diese Binärdaten müssen nun in 10-Bit Blöcken gelesen werden. So ergibt sich:
1.Wert: 0000011111 => (dezimal) 31
2.Wert: 0000100001 => (dezimal) 33
3.Wert: 0000011111 => (dezimal) 31
4.Wert: 0000100000 => (dezimal) 32
4) Da es sich bei dem Datensatz um die allerersten Daten in der Datei handelt, wurden auf diese Weise die Werte für Rot1, Grün1, Rot2, Grün2 aus der bekannten Matrix
RGRG...RGRG
GBGB...RBGB
....................
RGRG...RGRG
GBGB...GBGB
eingelesen. Die GB-Anteile sind in der 2. Zeile der Matrix und sind viel weiter hinten in der Datei gespeichert.
Die Werte sind mit 30-32 sehr klein (der maximale Wert ist (2 hoch 10 - 1) = 1023). Dies liegt daran, dass es im RAW-Bild einen Bildbereich gibt, der im JPG nicht zu sehen ist weil er schwarz ist und daher einfach abgeschnitten wird. Aus diesem Bereich stammen die Daten, die eingelesen wurden.
Bis hier bin ich momentan gekommen. Das Weitere muss ich noch programmieren:
5) Die 10Bit-Zahlen müssen nun noch etwas skaliert werden, da die Daten nicht linear gespeichert sind (doppelt so hoher Zahlenwert heißt nicht unbedingt doppelt so hell)
6) Aus der Matrix müssen nun Bildpunkte berechnet werden, die alle 3 Farben (R,G,B) besitzen.
Es bleibt also viel zu tun....