- 12V Akku mit 280 Ah bauen         
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
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    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.

  2. #2
    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!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    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.

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

  5. #5
    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)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    im zweifelsfall mit pointer

    Code:
    void Color16bit2RGB(uint16_t color16, uint8_t* R, uint8_t* G, uint8_t* B) {
    
       *R = (uint8_t)((0b1111100000000000 & color16) >> 11);
       *G = (uint8_t)((0b0000011111100000 & color16) >> 5);
       *B = (uint8_t)((0b0000000000011111 & color16));
    }
    muss gestehen dass ich solche reference calls meide, weils mir leicht spanisch ist
    pointer sind für mich persönlich einfacher zu handhaben

    beim aufruf musst du dann natürlich dioe adressen auflösen

    Code:
    uint8_t myR,myG,myB;
    Color16bit2RGB(some16bitColor, &myR, &myG, &myB);
    printf("<font color=\"#%00h%00h%00h\">",myR,myG,myB);

    PS: ich habe die einzelnen farben mal auf 8 bit reduziert und einen expliziten cast mit eingebaut damit alles sauber aussieht
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    HaWe
    Gast
    danke für die Mühe!
    Ich muss allerdings auch etwas gestehen...: dass mir das mit diese Pointern mit * und dann doch wieder & im Hauptprogramm noch viel unklarer ist, mit Pointer hin und vorher und hinterher referenzieren oder dereferenzieren oder wie auch immer das heißt - wenn möglich würde ich lieber eindeutige Variablennamen im Hauptprogramm verwenden, die dann per Referenz übergeben werden und auf die man dann nach Ende der Funktion wieder als aktuaisierte Werte per Variabennamen zugreifen kann.
    Aber auch da komme ich immer ins Schleudern. Hatte gehofft, das könnte irgendwer aus dem Stegreif...

    so, nochmal getestet - das mit dem "&" klappt...
    Rest nochmal in Arbeit...



    funktioniert noch nicht ganz perfekt...

    - - - Aktualisiert - - -

    Code:
    uint16_t ColorRGB216bit(uint16_t R, uint16_t G, uint16_t B) {
    
       return  ((uint16_t)R << 11) | (((uint16_t)G << 5) & 0b0000011111100000) | ((uint16_t)B & 0b0000000000011111);
    }
    
    
    void Color16bit2colorRGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) {
    
       R = (uint8_t)((0b1111100000000000 & color16) >> 11);
       G = (uint8_t)((0b0000011111100000 & color16) >> 5);
       B = (uint8_t)((0b0000000000011111 & color16));
       Serial.println("");
       Serial.println("Unterprogramm color16 zu RGB:");
       Serial.println( (String)"color16="+(String)color16);
       Serial.println( (String)"R="+(String)R);
       Serial.println( (String)"G="+(String)G);
       Serial.println( (String)"B="+(String)B); 
    }
    
    void setup() {
      // put your setup code here, to run once:
    
       uint16_t r=255, g=102, b=78, 
                col16=0;               // Dark Pink (255,102,78)
    
    
       Serial.begin(115200);
       
       Serial.println("Hauptprogramm vor Aufruf:");
       Serial.println( (String)"col16="+(String)col16);
       Serial.println( (String)"r="+(String)r);
       Serial.println( (String)"g="+(String)g);
       Serial.println( (String)"b="+(String)b);
       Serial.println("");
       
       col16=ColorRGB216bit(r,g,b);
       r=g=b=0; // Rücksetzen!
    
       Serial.println("Hauptprogramm nach rgb zu col16-Berechnung (rgb Einzelwerte dann gelöscht):");
       Serial.println( (String)"col16="+(String)col16);
       Serial.println( (String)"r="+(String)r);
       Serial.println( (String)"g="+(String)g);
       Serial.println( (String)"b="+(String)b);
       
       Color16bit2colorRGB(col16, r, g, b);
       Serial.println("");
       Serial.println("Hauptprogramm nach col16 zu rgb:");
       Serial.println( (String)"col16="+(String)col16);
       Serial.println( (String)"r="+(String)r);
       Serial.println( (String)"g="+(String)g);
       Serial.println( (String)"b="+(String)b);   
        
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
    }
    Ausgabe:

    Hauptprogramm vor Aufruf:
    col16=0
    r=255
    g=102
    b=78

    Hauptprogramm nach rgb zu col16-Berechnung (rgb Einzelwerte dann gelöscht):
    col16=64718
    r=0
    g=0
    b=0

    Unterprogramm color16 zu RGB:
    color16=64718
    R=31
    G=38
    B=14

    Hauptprogramm nach col16 zu rgb:
    col16=64718
    r=31
    g=38
    b=14
    Geändert von HaWe (10.09.2018 um 12:29 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
  •  

12V Akku bauen