- SF800 Solar Speicher Tutorial    Werbung      
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
    danke für den Post!
    ich habe jetzt neu codiert:
    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)(color16/524288);
       G = (uint8_t)(color16/1024);
       B = (uint8_t)((color16/8)&31);
       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;               // 0xFF66B2;  // Dark Pink (255,102,78)
    
    
       Serial.begin(115200);
       delay(3000);
       
       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 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:
    
    }
    und bekomme jetzt den output:
    Code:
    Hauptprogramm vor Aufruf:
    col16=0
    r=255
    g=102
    b=78
    
    Hauptprogramm nach rgb zu col16-Berechnung (rgb gelöscht):
    col16=64718
    r=0
    g=0
    b=0
    
    Unterprogramm color16 zu RGB:
    color16=64718
    R=0
    G=63
    B=25
    
    Hauptprogramm nach col16 zu rgb:
    col16=64718
    r=0
    g=63
    b=25
    hmmmm...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Code:
    G = (uint8_t)(color16/1024);
    
    muss, wenn dann so:
    
    G = (uint8_t)(color16/1024)&63;
    Allerdings schreibst Du "color16". sind das als Quelle 16Bit-Farben? RGB-8-8-8 sind 24Bit-Farben. RGB-5-6-5 sind 16Bit-Farben.

  3. #3
    HaWe
    Gast
    ja, es handelt sich immer um die 16-bit Zahlen
    r,g,b haben immer die volle range von 0-255, die dann nur anders in die 16- bzw. auch optional 24-bit oder 32-bit truecolor umkodiert werden sollen.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Ich hatte gelesen, Du schriebst, dass nicht so einfach ist, wie in HTML - Farben für Webseiten. Die sind dort 8bit-8bit-8bit (style="color:#452f63"), 45h - 2fh - 63h. Macht 24Bit.

    Von welchem Farbformat, nach welchem muss es denn?

    "r,g,b haben immer die volle range von 0-255, die dann nur anders in die 16- bzw. auch optional 24-bit oder 32-bit truecolor umkodiert werden sollen."

    Dann ist es 8-8-8 nach 5-6-5. Wo ist der Fehler?

    Code:
    sinngemäß wäre so richtig:
    
    G = (uint8_t)(color24/1024)&63;
    Allerdings kann man die 24Bit-Farbe natürlich nur in ein 32Bit-Register packen. Um in einem Stück zu rechnen.
    Dumm gelaufen, wenn der Arduino nur 16Bit-Register hat Bild   Vor Jahren noch hätte ich das jetzt einfach auf 16Bit-Operationen aufgeteilt, als ich noch in Übung war. So muss ich nochmal drüber nachdenken.

    Nachtrag:

    Vorher war der ganze 24Bit-Farbwert: rgb888

    Wenn die Farbwerte einzeln vorliegen, ist es so, wie ich Anfangs schrieb:

    int rot1 = rot/8; int gruen1 = gruen/4; int blau1 = blau/8;

    So wird aus Rot mit 8 Bit, Rot mit 5 Bit, aus Grün mit 8 Bit, wird Grün mit 6 Bit, aus Blau mit 8 Bit, wird Blau mit 5 Bit.
    Geändert von Moppi (10.09.2018 um 12:36 Uhr)

  5. #5
    HaWe
    Gast
    also noch mal von vorn:
    r,g,b-Werte sind ja als Vorgabe universell,
    weiß ist immer (255, 255,255)
    und rot immer (255,0,0 )
    und "Dark Pink" z.B. (255,102,78 ) etc.

    in html habe ich meist 24-bit, das ist einfach: color24 = (r<<16)+(g<<8 )+b

    hier geht es aber jetzt um die color16 - Kodierung (hin und zurück).

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Demnach müsste es so sein, von R,G,B Einzelwerten zu 16Bit-Werten:

    Code:
    rgb =  ((rot/8)*2048) | ((grün/4)*32) | (blau/8);
    und zurück müsste dann so sein:

    Code:
    rot = (rgb/2048)*8; 
    grün = (rgb&2016)/8;
    blau = (rgb&31)*8;
    Geändert von Moppi (10.09.2018 um 13:09 Uhr)

  7. #7
    HaWe
    Gast
    hast du das mal selber getestet? Ich hatte doch den Arduino Code gepostet...
    Code:
    uint16_t ColorRGB216bit(uint16_t R, uint16_t G, uint16_t B) {
    
       return  ((R/8)*2048) | ((G/4)*32) | (B/8);
    }
    
    
    void Color16bit2colorRGB(uint16_t color16, uint16_t &R, uint16_t &G, uint16_t &B) {
    
       R = (uint8_t)(color16 / 2048)*8;
       G = (uint8_t)(color16 & 2016)/8;
       B = (uint8_t)(color16 &31)*8;
       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;               // 0xFF66B2;  // Dark Pink (255,102,78)
    
    
       Serial.begin(115200);
       delay(3000);
       
       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 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:
    
    }

    ergibt:
    Code:
    Hauptprogramm vor Aufruf:
    col16=0
    r=255
    g=102
    b=78
    
    Hauptprogramm nach rgb zu col16-Berechnung (rgb gelöscht):
    col16=64297
    r=0
    g=0
    b=0
    
    Unterprogramm color16 zu RGB:
    color16=64297
    R=248
    G=4
    B=72
    
    Hauptprogramm nach col16 zu rgb:
    col16=64297
    r=248
    g=4
    b=72
    Teste doch bitte mal selber, sei so nett... Bild  

Ä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
  •  

    Werbung      fchao-Sinus-Wechselrichter AliExpress