rgb color auf 16 farben runterrechnen



  • Ich suche einen algorithmus um in meinem Programm Zahlenwerte die RGB Color darstellen (html format rgb color) auf 16 Farben zu reduzieren, ich benutze Visual Studio, kann jemand helfen?



  • Also, hier hast du eine liste der Farben inklusive Hex-RGB-Werte: http://de.selfhtml.org/diverses/anzeige/farbnamen_16.htm
    Wie du siehst, musst du nur überprüfen, welchem Wert deine R G B Werte am nächsten sind...
    (wobei ich erstmal Silber aussen vorlassen würde, denn das ist irgendwie ein Sonderfall... 😮 )

    Das heisst, du benötigst jetzt eine Funktion, die RGB Werte überprüft und die auf 16 Farben 'runtergebrochenen' zurückliefert...
    Brauchst du noch hilfe, wie so eine Funktion aussehen könnte?!? Wenn ja, dann sag bescheid 😉

    ndT Lupo

    Was nützt es dem Menschen, wenn er Lesen und Schreiben gelernt hat,
    aber das Denken anderen überläßt?

    ^Ernst R. Hauschka^



  • Ah danke erstmal für den Hinweis. So und dann würde ich gerne noch dein Angebot bezüglich der Hilfe zur Farbumrechnung in Anspruch nehmen. Nicht jetzt den Programmiercode, der ist nicht das Problem, ich muß erst mal verstehen, wie man da am besten ansetzt. Es ist ja offen sichtlich daß es da 7 Kombinationen mit 00+80 und 7 Kombinationen mit 00+FF sowie die beiden Sonderfälle #000000 und #C0C0C0 gibt. Hmm jetzt hörts aber auch schon auf mit dem Verstehen.

    cu Bob



  • 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