www.mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Tungistan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welchen Bit´s ist bei Deinem 16-Bit-Wert welche Farbe enthalten?

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Om Pf (ompf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
red >>= 3; //von 8 auf 5 bit
green >>= 2; //von 8 auf 5 bit
blue >>= 3; //von 8 auf 5 bit

//dann kannst du die werte in der formel zusammenbauen:

color_16_bit = (red << 11) + (green << 5) + blue;
Hoffe das passt so :-)

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder so:
#define ASSEMBLE_RGB(R, G, B)    ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3))

color_16_bit = ASSEMBLE_RGB(red, green, blue);


Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.