2009-07-28 9 views
1

Ich habe einen 16-Bit-Luminanzwert in zwei Bytes gespeichert, und ich möchte dies in R-, G- und B-Werte umwandeln. Ich habe zwei Fragen: wie konvertiere ich diese zwei Bytes zu einem kurzen, und unter der Annahme, dass der Farbton und die Sättigung 0 ist, wie mache ich diesen Kurzschluss in 8 Bits pro Komponente RGB-Werte?Konvertieren eines 16-Bit-Luminanzwerts in 32-Bit-RGB

(Die Convert-Klasse nicht über eine Option, eine kurze zwei Bytes und Ausgang zu nehmen.)

Antwort

2

Wenn der 16-Bit-Wert Little Endian und unsigned ist, wäre das zweite Byte das, das Sie 3x wiederholen möchten, um den RGB-Wert zu erstellen, und Sie würden das andere Byte löschen. Oder wenn Sie das RGB in einer 32-Bit-Ganzzahl haben möchten, könnten Sie entweder Bit-Verschiebungen und Additionen verwenden oder dieses zweite Byte einfach mit 0x10101 multiplizieren.

+0

Das ist genau das, was ich brauche, danke! – RCIX

2

so etwas wie dieses Versuchen:

byte luminance_upper = 23; 
byte luminance_lower = 57; 
int luminance = ((int)luminance_upper << 8) | (int)luminance_lower; 

die Sie zwischen 0-65535 einen Wert geben .

Wenn Sie nur eine 32-Bit-ARGB-Farbe (Graustufenfarbe) erhalten möchten, spielt das untere Byte natürlich keine Rolle, da Sie von einer 16-Bit-Luminanz auf 8-Bit-R gehen , G, B Komponenten.

byte luminance_upper = 255; 
// assuming ARGB format 
uint argb = (255u << 24)      // alpha = 255 
      | ((uint)luminance_upper << 16) // red 
      | ((uint)luminance_upper << 8) // green 
      | (uint)luminance_upper;   // blue (hope my endianess is correct) 

Je nach Situation kann es einen besseren Weg zu gehen darüber. Der obige Code führt z. B. eine lineare Zuordnung durch. Sie können jedoch bessere Ergebnisse erzielen, wenn Sie eine logarithmische Kurve verwenden, um die 16-Bit-Werte den 8-Bit-RGB-Komponenten zuzuordnen.

+0

Mit "32-Bit-Graustufen-Nummer" bedeutet er "Alpha, R, G, B, wo jeweils 8 Bit und R = G = B." – Crashworks

+0

yep, hoffe es ist jetzt ein bisschen klarer. – geofftnz

0

Sie benötigen auch die anderen Komponenten (Farbton und Sättigung).

Auch klingt 16-Bit ein bisschen komisch. Normalerweise sind diese Werte Gleitkommawerte.

Es gibt einen sehr guten Artikel über CodeProject für Konvertierungen vieler Farbräume.