- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 63

Thema: Farben nach R,G,B umwandeln in 4-stell. hex-code?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast

    Farben nach R,G,B umwandeln in 4-stell. hex-code?

    Hallo,
    Adafruit verwendet für Farben einen 4-stelligen hex-Code, der nicht mit den 6-stelligen hex-Codes identisch ist, wie man sie von html kennt.
    Kennt jemand eine Konvertierungs-Routine oder Vorschrift, um die R,G,B-Werte (jew. 0-255) in den Adafruit Code umzurechnen?
    Code:
    #define ILI9341_BLACK       0x0000  ///<   0,   0,   0
    #define ILI9341_NAVY        0x000F  ///<   0,   0, 123
    #define ILI9341_DARKGREEN   0x03E0  ///<   0, 125,   0
    #define ILI9341_DARKCYAN    0x03EF  ///<   0, 125, 123
    #define ILI9341_MAROON      0x7800  ///< 123,   0,   0
    #define ILI9341_PURPLE      0x780F  ///< 123,   0, 123
    #define ILI9341_OLIVE       0x7BE0  ///< 123, 125,   0
    #define ILI9341_LIGHTGREY   0xC618  ///< 198, 195, 198
    #define ILI9341_DARKGREY    0x7BEF  ///< 123, 125, 123
    #define ILI9341_BLUE        0x001F  ///<   0,   0, 255
    #define ILI9341_GREEN       0x07E0  ///<   0, 255,   0
    #define ILI9341_CYAN        0x07FF  ///<   0, 255, 255
    #define ILI9341_RED         0xF800  ///< 255,   0,   0
    #define ILI9341_MAGENTA     0xF81F  ///< 255,   0, 255
    #define ILI9341_YELLOW      0xFFE0  ///< 255, 255,   0
    #define ILI9341_WHITE       0xFFFF  ///< 255, 255, 255
    #define ILI9341_ORANGE      0xFD20  ///< 255, 165,   0
    #define ILI9341_GREENYELLOW 0xAFE5  ///< 173, 255,  41
    #define ILI9341_PINK 0xFC18 ///< 255, 130, 198

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Die Farben sind MSB>LSB 5bit R, 6bit G und 5bit B codiert

    du könntest also ganz simpel mit maskieren und shiften 3 bytes daraus machen wie du es gewohnt bist

    R = (0b1111100000000000 & input) >> 11;
    G = (0b0000011111100000 & input) >> 5;
    B = (0b0000000000011111 & input);

    https://en.wikipedia.org/wiki/List_o...tes#16-bit_RGB
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    HaWe
    Gast
    Zitat Zitat von Ceos Beitrag anzeigen
    Die Farben sind MSB>LSB 5bit R, 6bit G und 5bit B codiert

    du könntest also ganz simpel mit maskieren und shiften 3 bytes daraus machen wie du es gewohnt bist

    R = (0b1111100000000000 & input) >> 11;
    G = (0b0000011111100000 & input) >> 5;
    B = (0b0000000000011111 & input);

    https://en.wikipedia.org/wiki/List_o...tes#16-bit_RGB
    aha, danke!
    verstehe ich das richtig:
    also z.B. für LightHeliotrop (220, 139, 231):

    uint16_t R = (0b1111100000000000 & 220) >> 11;
    uint16_t G = (0b0000011111100000 & 139) >> 5;
    uint16_t B = (0b0000000000011111 & 231);

    uint16_t colorcode=R+G+B;

    ?

    - - - Aktualisiert - - -

    hmm, nee, scheint genau anders rum zu arbeiten...

    mit der Bitarithmetik komme ich aber nicht zurecht - wie sähe die Umkehrfunktion aus, aus den RGW-Einzelwerten die hex colorcode Zahl?

    einfach
    R =220 << 11;
    G = 139 << 5;
    B = 231;
    colorcode=R+G+B;

    ?

    PS,
    ja, schein zu klappen so rum...
    Danke!

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    ne das war die umrechnung von 16bit (sog. 65k Farbraum) auf R G B

    wolltest du es umgekehrt? Sorry

    RGB16 = ((uint16_t)R << 11) | (((uint16_t)G << 5) & 0b0000011111100000) | ((uint16_t)B & 0b0000000000011111);

    (uint16_t) muss zwingend vorher stehen und castet den 8bit auf einen 16bit, sonst fallen die bits nach dem 8ten ins nirvana

    ich kenne gerade nicht den 16bit unsigned int typ für arduino sorry

    (PS: Das ist auch der Grund weswegen ich so einen sprechenden typen verwende, egal welcher compiler oder welche umgebnung jeder macht es anders)
    Geändert von Ceos (06.09.2018 um 17:41 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    HaWe
    Gast
    danke vielmals, so passts!

  6. #6
    HaWe
    Gast
    das erste in eine Funktion zu packen mit Rückgabewert, ist ja einfach -
    Code:
    //---------------------------------------------------------
    // ColorRGB2color16bit
    //---------------------------------------------------------
    
    int16_t ColorRGB2color16bit(uint16_t R, uint16_t G, uint16_t B) {
    
       return  ((uint16_t)R << 11) | (((uint16_t)G << 5) & 0b0000011111100000) | ((uint16_t)B & 0b0000000000011111);
    ]
    kann man die Rückwärtstransformierung so programmieren (bin mir unsicher wegen pass per reference):


    Code:
    //---------------------------------------------------------
    // Color16bit2RGB
    //---------------------------------------------------------
     
    void Color16bit2RGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) {
    
       R = (0b1111100000000000 & color16) >> 11;
       G = (0b0000011111100000 & color16) >> 5;
       B = (0b0000000000011111 & color16);
    }
    Geändert von HaWe (06.09.2018 um 23:12 Uhr)

Ähnliche Themen

  1. String nach Array umwandeln (?)
    Von slavezero im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 07.06.2012, 17:21
  2. Chips die nach Seriell umwandeln
    Von dundee12 im Forum Elektronik
    Antworten: 13
    Letzter Beitrag: 12.08.2010, 09:08
  3. word nach byte umwandeln
    Von magic33 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 21.02.2007, 16:04
  4. C-Code in hex umwandeln
    Von elkokiller im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 16.02.2006, 09:41
  5. PAL-Videosignal irgendwie nach seriell umwandeln?
    Von Trabukh im Forum Elektronik
    Antworten: 39
    Letzter Beitrag: 14.09.2005, 13:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test