Forum: Mikrocontroller und Digitale Elektronik RGB-Wert in 16-bit Farbwert umwandeln


von Sebastian (Gast)


Lesenswert?

Hallo,

ich möchte folgenden RGB-Wert R: 217, G: 214, B219
in einen 16Bit-Farbwert nach folgender Formel umwandeln:

color_16_bit = (red << 11) + (green << 5) + blue

Wie gehe ich da vor? bzw. wie kann ich einen Hex-Wert z.B. F5A4 in einen 
RGB-Wert mit der obigen Formel umwandeln?
Steh irgendwie auf dem Schlauch...

von Tungistan (Gast)


Lesenswert?

In welchen Bit´s ist bei Deinem 16-Bit-Wert welche Farbe enthalten?

von Joachim B. (jojo84)


Lesenswert?

Also entweder versteh ich dich falsch, oder das, was du vor hast, ist so 
nicht möglich. Deine drei Farbwerte sind ja z.Z. 8-bittig. Wenn du die 
alle hintereinander packst hast du also 24 Bit. Und das passt so beim 
besten Willen nicht in eine 16-Bit-Zahl. Du hast es oben ja auch schon 
so dargestellt: dein gewünschtes Format des FArbwertes: 0xF5A4 -> 16 
Bit.
Außerdem: wenn du das machst:

> color_16_bit = (red << 11) + (green << 5) + blue

dann verlierst du red, von green verlierst du die oberen 5 Bit 
(zumindest bei 8-Bit-Werten).
Was willst du denn machen? Gibt es vielleicht einen geschickteren 
Lösungsansatz?
Oder hab ich dich falsch verstanden?

Gruß

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Ich glaube, das ganze soll einfach eine Transformation von einem 24 Bit 
Farbraum auf einen 16 Bit Farbraum werden.

von Osche R. (Gast)


Lesenswert?

Sebastian schrieb:

> color_16_bit = (red << 11) + (green << 5) + blue

Du willst 0b 0rrr rrgg gggb bbbb. D.h. Du musst erstmal von jedem 
RGB-Wert die unteren drei Stellen wegschmeißen. Die kann sowieso kein 
TFT anzeigen, zumindest keins, das Du Dir zum Basteln leisten willst.

Also eher

color_16_bit = ((red >>3) << 10) || ((green >> 3) << 5) + (blue >> 3)


> Wie gehe ich da vor? bzw. wie kann ich einen Hex-Wert z.B. F5A4 in einen
> RGB-Wert mit der obigen Formel umwandeln?

Erst die unerwünschten bits ausblenden, dann zurechtschieben.

red = color_16_bit >> 7
green = (color_16_bit >>2) && 0x1F
blue = (color_16_bit && 0x1F) << 3


Die Umcasterei von u16 auf u08 habe ich mal weggelassen.


Patrick

von Floh (Gast)


Lesenswert?

Sebastian schrieb:
> ich möchte folgenden RGB-Wert R: 217, G: 214, B219
> in einen 16Bit-Farbwert nach folgender Formel umwandeln:
>
> color_16_bit = (red << 11) + (green << 5) + blue

Also hast du

Bits     Farbe     Breite in bit
15-11     rot       5
10-5      grün      6
4-0       blau      5

Also musst du deine Farbwerte von 8 bit auf die benötigten Bittiefen 
runterskalieren:
1
red >>= 3; //von 8 auf 5 bit
2
green >>= 2; //von 8 auf 5 bit
3
blue >>= 3; //von 8 auf 5 bit
4
5
//dann kannst du die werte in der formel zusammenbauen:
6
7
color_16_bit = (red << 11) + (green << 5) + blue;
Hoffe das passt so :-)

von Matthias K. (matthiask)


Lesenswert?

oder so:
1
#define ASSEMBLE_RGB(R, G, B)    ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3))
2
3
color_16_bit = ASSEMBLE_RGB(red, green, blue);

von Reinhard Kern (Gast)


Lesenswert?

Floh schrieb:
> //dann kannst du die werte in der formel zusammenbauen:
>
> color_16_bit = (red << 11) + (green << 5) + blue;
> [/c]
> Hoffe das passt so :-)

Hallo,

soweit so gut, aber das ist trunc, also abschneiden, und nicht round. 
Ich würde die Farbwerte lieber runden, das müsste bessere Ergebnisse 
bringen, also z.B. den verbleibenden R,G, oder B-Wert um 1 erhöhen, wenn 
das nächste unbenutzte Bit 1 ist; oder vorher entsprechend 1/2 LSB 
addieren.

Gruss Reinhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.