Farben Multiplizieren



  • Moin Moin.

    Ich versuche die Ebenen-Modi von Photoshop (genaugenommen nur "Multiplizieren") nach zu Programmieren und dann damit Selber Bilder zusamm zu setzen.
    Ich hatte jetzt schon das halbe Internet (anscheinend die falsche Hälfte...) durchsucht nach einer Formel dafür. Die Meisten die ich gefunden habe sind allerdings nur für RGB Bilder. Ich benötige aber RGBA.

    Farbanteile sind Floatwerte von 0 bis 1

    An sich ist es in der Theorie ganz einfach.
    Für RGB:

    R = Rd * Rs
    G = Gd * Gs
    B = Bd * Bs
    

    Alpha allein ist auch einfach, dass wird beim Multiplizieren mit Porter-Duff berechnet:

    A = Ad + (1.0f - Ad) * As
    

    Jetzt zum Problem: Beim RGB Anteil muss auch noch was vom Alpha Anteil eingerechnet werden. Dafür hab ich auch eine Formel gefunden (von SVG):

    C = (1-Ad)*Cs + (1-As)*Cd + Cd*Cs
    

    Allerdings funktioniert diese Formel nicht...
    Wenn man ein Rot mit 0.88 mit einem komplett durchsichtigen Weiß Multipliziert bekommt man ein Rot-Wert > 1

    As = 0.0
    Ad = 1.0
    Cs = 1.0
    Cd = 0.88
    
    C = (1-1.0)*1.0 + (1-0.0)*0.88 + 0.88*1.0
    C = 0           +         0.88 + 0.88
    C = 1.76
    

    Hab ich irgendwo was Falsch verstanden? Hat jemand ne andere Formel?

    Viele Grüße

    edit:

    So hier nochmal das Bild:
    1-2: Meine Formen
    3: Was ich haben will (was PhotoShop Macht)
    4: Was ich bekomme mit den Formeln.
    http://imageshack.us/photo/my-images/194/multim.png/



  • Probier es mal mit diesen Formeln: http://de.wikipedia.org/wiki/Alpha_Blending



  • Die Formeln beschreiben leider nur reines Alpha Blending. Das hilft mir in dem Fall nicht weiter.
    Ich glaube um das Problem besser zu beschreiben werde ich gleich mal ein paar bilder einfügen.



  • Dafür hab ich auch eine Formel gefunden (von SVG) ... Hab ich irgendwo was Falsch verstanden?

    Na wie du schreibst, hast du gar nichts verstanden, sondern probierst nur wild irgendwelche Formeln aus.

    Rot-Wert > 1

    Laut deinen Bildern ist das nicht dein Problem. Bei dir wird es schwarz.



  • Naja die Theorie dahinter verstehe ich schon. Ich verstehe nur nicht warum es bei SVG funktioniert (bzw. funktionieren soll) und bei mir nicht.
    Mal davon abgesehen hilft es mir nicht, dass mir gesagt wird das ich es nicht verstanden habe. Also vielen dank für diesen konstruktiven Beitrag.

    Edit:

    Der Problem ist es auch nicht das es nicht schwarz wird sondern das es an den falschen stellen schwarz wird. Die Rundungen gehen verlohren



  • FlameDiver schrieb:

    Naja die Theorie dahinter verstehe ich schon. .. Ich verstehe nur nicht warum es bei SVG funktioniert (bzw. funktionieren soll) und bei mir nicht.

    Ach, du widersprichst dir. Sage mir doch bitte, was der Alpha-Wert einer "Farbe" angibt, in Worten.

    Mal davon abgesehen hilft es mir nicht, dass mir gesagt wird das ich es nicht verstanden habe. Also vielen dank für diesen konstruktiven Beitrag.

    Das weiss ich ... Selber denken Glueck verschenken. Darueber hinaus kann dein Effekt mit vielen Formel erzeugt werden. Leider hast du dir Spezialfaelle mit "weiss" und 100% alpha herausgesucht. Und wenn die SVG-Formel in diesem Kontext von Photoshop angewendet werden wuerde, dann muesste die Ecke ein kraeftigeres Rot enthalten als das restlich rote Objekt, 1.76 auf 1.0 geclippt wuerde.


  • Mod

    soweit ich weiss, macht man multiplikativ auf rgb und danach ein normales alpha-blending. (alpha-blending wird immer gemacht, afaik, unabhaengig von den RGB blend modes).



  • rapso schrieb:

    soweit ich weiss, macht man multiplikativ auf rgb und danach ein normales alpha-blending. (alpha-blending wird immer gemacht, afaik, unabhaengig von den RGB blend modes).

    Das hatte ich auch so verstanden. Und das klappt ja auch bis auf die abgerundeten ecken.

    @knivil:
    wenn Ich es druch selber denken hätte lösen können, hätte ich wohl nicht gefragt. Und wenn es da so viele Formeln gibt wäre mir mehr damit geholfen als mit unnützen gegenfragen. Und wenns sein Muss: Alpha gibt die "Durchsichtigkeit" einer Farbe an. Sprich wieviel man prozentual noch von der "unteren" Farbe sieht. Da neben gibts auch noch die Opacity. Die gibt das gleiche nur andersrum an. 100% Alpha ≡ 0% Opacity
    Hab schließlich nicht umsonst Medieninformatik Studiert -.-



  • Beispiel: Den Effekt erziehlt man mit normalen Alphablending. Man ignoriert das Alpha der unteren Farbe einfach. Also quasi die erste Antwort hier.

    Hab schließlich nicht umsonst Medieninformatik Studiert -.-

    Kein Kommentar ...



  • Beispiel: Den Effekt erziehlt man mit normalen Alphablending. Man ignoriert das Alpha der unteren Farbe einfach. Also quasi die erste Antwort hier.

    Genau das war das erste was ich gemacht habe. Was nicht funktioniert hat.

    Hab die Formel selber zufällig durch ausprobieren rausgefunden gefunden:

    struct Color { float r,g,b,a };
    Color cLayer, cIn, result;
    result.r = cLayer.r * cIn.r * cIn.a * cLayer.a + cLayer.r * (1.0f - cIn.a) * cLayer.a + cIn.r * (1.0f - cLayer.a) * cIn.a;
    result.g = cLayer.g * cIn.g * cIn.a * cLayer.a + cLayer.g * (1.0f - cIn.a) * cLayer.a + cIn.g * (1.0f - cLayer.a) * cIn.a;
    result.b = cLayer.b * cIn.b * cIn.a * cLayer.a + cLayer.b * (1.0f - cIn.a) * cLayer.a + cIn.b * (1.0f - cLayer.a) * cIn.a;
    result.a = cIn.a + (1.0f - cIn.a) * cLayer.a;
    

    ➡ Closed



  • Die Sache mit den Ecken ist aber kein Fehler in der Formeln.

    Setz mal ein:
    αC = αA + (1 − αA)αB
    αC = 0 + (1 − 0)αB
    αC = αB

    C = (αA * CA + (1 − αA)αB * CB) / αC
    C = (0 * CA + (1 − 0)αB * CB) / αB
    C = (αB * CB) / αB
    C = CB

    Die neue Farbe entspricht also der des roten Plättchens.
    Es scheint eher ein Problem in deinem Code zu sein.

    edit: Okay, wenns jetzt klappt ist ja gut.


Anmelden zum Antworten