2010-12-10 6 views
3

Ich muss 16-Bit XRGB1555 in 24-Bit RGB888 konvertieren. Meine Funktion dafür ist unten, aber es ist nicht perfekt, d. H. Ein Wert von 0b11111 ergibt 248 als Pixelwert, nicht 255. Diese Funktion ist für Little-Endian, kann aber leicht für Big-Endian modifiziert werden.Wie konvertiert man in C# von RGB555 zu RGB888?

public static Color XRGB1555(byte b0, byte b1) 
{ 
    return Color.FromArgb(0xFF, (b1 & 0x7C) << 1, ((b1 & 0x03) << 6) | ((b0 & 0xE0) >> 2), (b0 & 0x1F) << 3); 
} 

Irgendwelche Ideen, wie es funktioniert?

Antwort

7

Sie würden normalerweise die höchsten Bits kopiert bis zu den unteren Bits, also wenn Sie fünf Bits wie folgt hatte:

Bit position: 4 3 2 1 0 
Bit variable: A B C D E 

Sie würden, dass als auf acht Bits erweitern:

Bit position: 7 6 5 4 3 2 1 0 
Bit variable: A B C D E A B C 

That So bleiben alle Nullen alle Nullen, alle Einsen werden alle Einsen und die Werte dazwischen skalieren entsprechend.

(Beachten Sie, dass A, B, C usw. keine Hexadezimalziffern sein dürfen - sie sind Variablen, die ein einzelnes Bit darstellen).

+1

also, wenn x das Ergebnis meiner aktuellen Funktion ist, möchte ich x | (x >> 5) – Origamiguy

+0

Ja, das ist richtig, vorausgesetzt, Ihr Wert ist in Bits 7-3, oder wie @CodeInChaos angibt, wenn Sie es in Bits 4 haben 0, dann ist es (x <<3)|(x>> 2). – stusmith

0

Beginnen Sie mit ein paar Tests zu schreiben:

Color c = XRGB1555(0, 0) => expect c RGB == 0,0,0 
Color c = XRGB1555(0xff, 0xff) => expect c RGB == ff,ff,ff. 

Der Rest folgen!

+0

warum -1? - jemand mag TDD nicht? – GarethOwen

+1

Das OP hatte bereits einen Testfall, der fehlschlägt und wissen will, wie es funktioniert. Also, während Tests gut sind, hilft dieser Beitrag überhaupt nicht mit seinem Problem. – CodesInChaos

2

Ich würde mit einer Nachschlagetabelle gehen. Da es nur 32 verschiedene Werte gibt, passt es sogar in eine Cache-Zeile.

Sie können den 8-Bit-Wert aus dem 5-Bit-Wert mit bekommen: return (x<<3)||(x>>2);

Die Rundung wenn auch nicht perfekt sein könnte. I.e. das Ergebnis ist der Eingabe nicht immer am nächsten, aber es ist nie weiter entfernt als 1/255.

+0

Bei der Rundung sind Sie 1/255 zu niedrig für 3/31 und 7/31 und 1/255 zu hoch für 24/31 und 28/31. –

Verwandte Themen