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...
In welchen Bit´s ist bei Deinem 16-Bit-Wert welche Farbe enthalten?
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ß
Ich glaube, das ganze soll einfach eine Transformation von einem 24 Bit Farbraum auf einen 16 Bit Farbraum werden.
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
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 :-)
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); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.