Farbe herausbekommen am Farbspektrum?



  • Anhand der x,y Position deiner Maus würde ich mal sagen, kannst du dann die Farbe errechnen lassen. Sollte eigentlich gar nicht so schwer sein, wie mein Vorgänger das schon gesagt hat, aber halt etwas schorf... Man musses versuchen zu Verstehen. Und da du wahrscheinlich jmd. eine Farbe auswählen lassen Willst, einfach bisschen was in eine neue Funktion basteln o.ä. und dann da die X, Y der Maus übergeben und ausrechnen, fertig ist der lack, ganz simpel.



  • Ja, das ist mir schon klar 😃
    Ich versuche noch mal das genauer zu erklären:

    Es scheitert eigentlich gar nicht am Code, sondern eher daran, zu verstehen, wie die Farbe Rot (255, 0, 0, 255) mit Schwarz (0, 0, 0, 150) oder mit Weiß (255, 255, 255, 100) aussehen könnte (also welcher Farbwert letztendlich rauskommt). Vielleicht ist das ganze auch einfach. Aber meine letzte Kunststunde liegt schon etwas länger zurück...

    Gruß



  • Gehen wir mal davon aus, dass Schwarz(0,0,0,255/2) ist und das auf ein Rot(255,0,0,255) angewandt wird dann folgt daraus ein Rot,welches um die Hälfte dunkler ist, also da dann zu einem entsprechenden anteil blau und gelb/grün reingemischt sind... Irgendwie so... würde ich mir das zumindest vorstellen...
    Am besten spielt man dazu erstmal ein bisschen mit Hexfarbwerten rum und schaut die sich in einem entsprechenden Viewer an um dann abschätzen zu können zu welchem anteil bei welcher Verdunklung andere Farben mit rein gemacht werden müssen oder auch nicht.... So in etwa? Bin in diesem Thema relativ jung unterwegs, daher kann das auch komplett falsch sein... Aber es sind meine Übelegungen dazu...

    EDIT: Wobei ja dann weniger Rotwert auch auf dunkler schließen lässt und man somit nur den rot wert um die hälfte verringern müsste... also um den Transparenz wert, den Schwarz hat verringern und bei Weiß muss man dann aber glaub ich andere Farben dazumischen damits heller wird... wie z.B. HellRed(255,100,100,255) oder so...



  • Hi.
    Stimmt, dass habe ich so noch gar nicht gesehen.

    Hier ist meine aktuelle Lösung um erstmal nur die Farbwerte herauszubekommen. Helligkeit wird dabei noch nicht beachtet:

    if (this->m_iX < 43)
    {
    	this->m_clrTemp.set(255, this->m_iX * 6, 0, 255);
    }
    else if (this->m_iX < 86)
    {
    	this->m_clrTemp.set(255 - this->m_iX * 6, 255, 0, 255);
    }
    else if (this->m_iX < 129)
    {
    	this->m_clrTemp.set(0, 255, this->m_iX * 6, 255);
    }
    else if (this->m_iX < 172)
    {
    	this->m_clrTemp.set(0, 255 - this->m_iX * 6, 255, 255);
    }
    else if (this->m_iX < 215)
    {
    	this->m_clrTemp.set(this->m_iX * 6, 0, 255, 255);
    }
    else
    {
    	this->m_clrTemp.set(255, 0, 255 - this->m_iX * 6, 255);
    }
    
    // this->m_iX ist die aktuelle X-Position des Cursors
    

    Sieht mir alles etwas murksig aus, vielleicht geht das ja noch einfacher. Aber was anderes kriege ich gerade nicht hin 😉

    Ich probier mal weiter herum.

    Gruß



  • Och würde sagen, mit den Farbwerten ist das so:
    Alte Farbe r, g, b (im Beispiel rot, also 255, 0, 0)
    Überdeckungsfarbe: r2, g2, b2, a2 (im Beispiel halbtransparentes schwarz, also 0, 0, 0 , 127)

    Neue Farbe: r3, g3, b3

    r3 = (255 - a2) / 255  * r  +  a2 / 255 * r2
    

    Analog für g3, b3.

    Im Beispiel wäre das also:

    r3 = 0.5 * 255 + 0.5 * 0  = 127
     g3 = 0.5 * 0 + 0.5 * 0    =   0
     b3 = 0.5 * 0 + 0.5 * 0    =   0
    

    es kommt also ein halb so helles rot raus.



  • Und wie sieht das dann bei helleren Farben aus, also heller als rot(255,0,0,255)?
    Kommen dann andere Farbspektren dazu um halt additiv Richtung weiß zu kommen oder spielt man da dann mit der Transparenz?



  • na, wenn man rot + weiß (50% transparent) rechnet, kommt ein helleres rot raus:

    [code]
    r3 = 0.5 * 255 + 0.5 * 255 = 255
    g3 = 0.5 * 0 + 0.5 * 255 = 127
    b3 = 0.5 * 0 + 0.5 * 255 = 127
    [\code]

    gibt ein schönes schweinchenrosa.



  • Hi.
    Danke!
    Habe mal versuchst das umzusetzen. Entweder ich mache was falsch oder die Berechnung stimmt leider doch nicht.

    Hier ist der Code:

    this->m_clrTemp.set(
      /*rot*/(255 - this->m_iY) / 255 * this->m_clrTemp.r() + this->m_iY / 255 * 255,
      /*gruen*/(255 - this->m_iY) / 255 * this->m_clrTemp.g() + this->m_iY / 255 * 255,
      /*blau*/(255 - this->m_iY) / 255 * this->m_clrTemp.b() + this->m_iY / 255 * 255,
      /*alpha*/255);
    

    Das ist jetzt für oben (also das weiße). Die resultierende Farbe ist aber leider immer Schwarz.

    Gruß



  • Du rechnest ja auch immer mit Integerwerten.
    Was ergibt dann z.B. "this->m_iY / 255" ? -)

    Statt jedoch auf Float bzw. Double zu wechseln, solltest du einfach die Formel anpassen:

    r3 = ((255 - a2) * r  +  a2 * r2) / 255
    


  • Hi.
    Danke - das sieht schon sehr viel besser aus. Allerdings ist das Problem, dass er ganz oben im Spektrum Rot anzeigt, und in der Mitte weiß (müsste anders herum). Ich habe bereits alle möglichen Kombinationen mit + und - 255 probiert, aber dann passt das alles nicht mehr.

    Und mit schwarz geht es leider auch gar nicht 😕

    // m_iY < 256 - weiß
    this->m_clrTemp.SetColor(
    	((255 - this->m_iY) * this->m_clrTemp.r() + (this->m_iY) * 255) / 255,
    	((255 - this->m_iY) * this->m_clrTemp.g() + (this->m_iY) * 255) / 255,
    	((255 - this->m_iY) * this->m_clrTemp.b() + (this->m_iY) * 255) / 255, 255);
    
    // m_iY > 256 - schwarz
    this->m_clrTemp.SetColor(
    	((255 - this->m_iY) * this->m_clrTemp.r() + this->m_iY * 0) / 255,
    	((255 - this->m_iY) * this->m_clrTemp.g() + this->m_iY * 0) / 255,
    	((255 - this->m_iY) * this->m_clrTemp.b() + this->m_iY * 0) / 255, 255);
    

    Gruß und Danke.


Anmelden zum Antworten