rgb color auf 16 farben runterrechnen



  • Hmm ich würde am ehesten einfach den gegebenen Wert nehmen. Diesen dann schritt für schritt mit den anderen überprüfen und gucken welcher am nähesten dran ist 🙂 Evt. dafür einfach einen fertigen Algo nehmen.. gibt es genug 😉 google.de hilft 🙂



  • Genau. Wie Devil schon gesagt hat. Du nimmst deinen RGB Wert. (beispielsweise #0A4510 )
    Jetzt teilst du den in die einzelnen Farben Rot/Grün/Blau. Dann hast du:

    R= 0A;
    G= 45;
    B= H3;

    So, wir wissen das unsere runterskalierten Werte entweder #00, #80 oder #FF haben müssen. (den sonderfall mit #C0 lassen wir aussen vor)
    Das heisst, wir müssen für jeden einzelnen Wert herausfinden, welchem dieser Endwerte (#00, #80,#FF) er am nächsten ist.

    Das könnte man mittels Subtraktion machen... z.b. so (R = 0A):
    #00 - R = -0A; // *(-1) weil wir den positiven Wert haben wollen!
    #80 - R = 76;
    #FF - R = F5

    Das Ergebnis, welches davon das kleinste ist (am nächsten bei 0 liegt), führt uns zu dem Enderwert, den wir benutzen müüsen. In diesem Fall #00, weil #0A der kleinste Wert ist.
    Für den G wert wäre es #80 und für den B Wert #FF (wenn du das nachrechnest 😉 )

    Am ende hast du dann irgendeine Kombination aus #00, #80 & #FF... und jede dieser Kombinationen führt zu einem der 16 Farbwerte... (bis auf das Silber... 😉 )

    Sonst noch fragen? 🙂

    ndT Lupo

    Um manche Delikte zu begreifen, genügt es, die Opfer zu kennen.
    ^Oscar Wilde^


  • Mod

    Jeder der drei Farberreiche für 16bit
    R 00, R 80, R FF
    ist 85 Einheiten weit.

    Also könnte man es so machen:
    int r16 = r32/85==0 ? 0 : r32/85==1 ? 0x80 : 0xFF;



  • @Lupo4u2
    ich glaube das was du vorschlägst trifft nicht so ganz zu, genau deine Beispielfarbe funktioniert so nicht weil als Ergebniss eine Kombination aus x00, x80 und xFF herauskommt, es gibt jedoch im 4Bit Bereich nur Kombinationen aus (x00 und x80) oder (x00 und xFF), aber nicht (x00, x80 und xFF). Aber um ehrlich zu sein genau auf diesm Weg habe ich es auch erst versucht. Ich denk man müsste irgendwie eine Gewichtung der Zahlen vornehmen. Aber auch hier stecke ich fest.

    cu Bob



  • @Martin Richter
    sorry auch bei längerem Überlegen steig ich da hinter wie das gemeint ist.

    cu Bob



  • nicht dahinter, mein ich natürlich


  • Mod

    Ganz real für das angesprochene Beispiel:
    R= 0x0A;
    G= 0x45;
    B= 0xF3;

    Würde nach meiner Umrechnung
    R = 0x00; // <0x55
    G = 0x00; // <0x55
    B = 0xFF; // >0xAA

    herauskommen.
    Ich habe es verinfacht nur für einen Farbwert dargestellt.



  • oh mann, du hast natürlich recht, html user... hab ich nicht bedacht, das es keine konstellation aus #00, #80 und #FF gleichzeitig gibt... sorry.

    Also dann, ein neuer Denkansatz:

    einfach die Hex-Werte (den kompletten RGB Wert) in Dezimal umrechnen und dann überprüfen, welchem der Endwerte es am nächsten liegt...

    Beispiel:

    Weiss = 0xFFFFFF = 16777215;
    Gelb = 0xFFFF00 = 16776960;
    lila = 0x800080 = 8388736;
    usw..

    Wenn du jetzt irgendeinen wert hast, sagen wir :
    Wert = 0xE600E6 = 15073510;

    müsstest du jetzt nur noch vergleichen, welchem deiner Endwerte er am nächsten ist... Damit sollte auch der Sonderfall Silber keine Probleme mehr darstellen 😉

    P.S. vielleicht sollte ich es erstmal ausprobieren, bevor ich es poste, aber hab hier auf'er Arbeit gerade keine vernünftige Umgebung laufen... 😞

    P.P.S. @Martin: so ganz versteh ich deine Rechnung auch noch nicht...

    ndT Lupo

    Ausnahmen sind nicht immer Bestätigung der alten Regel.
    Sie können auch Vorboten einer neuen Regel sein.

    ^Marie von Ebner-Eschenbach^


  • Mod

    Vergesst meinen Ansatz. 😞
    Er würde nur funktionieren wenn die 16 Farben alle Permutationen aus 0x0 0x80 0xff für R, G und B wären. Das würde aber 27 Ausprägungen bedeuten, die haben wir aber nicht. Wir haben eben spezielle 16...



  • Ah klar Lupo4u2 liegt ja eigentlich auf der Hand, da hab ich den Wald vor lauter Bäumen nicht gesehn.


Anmelden zum Antworten