Diskussion zum Artikel "Die Betrachtung der CCanvas-Klasse. Wie man transparente Objekte zeichnet" - Seite 6

 
Nikolai Semko:

Das, Peter, ist zu einfach.

Hier ist eine Aufgabe für Sie, um das Wesentliche der Frage zu erfassen und zu festigen:

- Wie kann man zwei Farben ARGB(a1,r1,g1,b1) und ARGB(a2,r2,g2,b2) in einer Ebene mischen, die jeweils ihre eigene Transparenz a1 und a2 haben?

Ohne diese Überblendung ist es unmöglich, Anti-Alias-Objekte korrekt übereinander zu legen.

Auf einen Blick: Auf der ersten Farbebene überlagern wir die erste ARGB(a1,r1,g1,b1) mit der im Artikel beschriebenen Methode. Dann legen wir die zweite Farbe über die erste, wobei wir die ARGB-Berechnungen nach derselben Formel durchführen. Nur dieses Mal wird die untere Farbe die erste sein, die wir über die ursprüngliche Farbe der Ebene legen.

Vielleicht liege ich falsch, Nikolai, aber warum sollte es nicht funktionieren?

ZY: Ich habe es noch nicht ausprobiert, aber es kann sein, dass die erste Option nicht funktioniert, weil die endgültige Transparenz der beiden oberen Ebenen falsch berechnet wird. In diesem Fall müssen Sie die mittlere Ebene mit der obersten Ebene mischen und, nachdem Sie eine gemeinsame Farbe erhalten haben, diese mit der ursprünglichen Ebene überlagern.

 
Реter Konow:

Auf einen Blick: Auf der ersten Farbebene überlagern wir die erste ARGB(a1,r1,g1,b1) mit der im Artikel beschriebenen Methode. Dann legen wir die zweite Farbe über die erste, wobei wir die ARGB-Berechnungen nach derselben Formel durchführen. Nur dieses Mal wird die untere Farbe die erste sein, die wir über die Farbe der ersten Ebene legen.

Vielleicht liege ich falsch, Nikolai, aber warum sollte es nicht funktionieren?

ZY: Ich habe es noch nicht ausprobiert, aber es kann sein, dass die erste Option nicht funktioniert, weil die endgültige Transparenz der beiden oberen Schichten falsch berechnet wird. In diesem Fall müssen Sie die mittlere Ebene mit der obersten Ebene mischen und, nachdem Sie eine gemeinsame Farbe erhalten haben, diese mit der ursprünglichen Ebene überlagern.

Das ist eigentlich keine leichte Aufgabe.
Aber wer sie alleine lösen kann, darf sich zu Recht als Farbguru bezeichnen.
Dieser Artikel ist gerade wegen des Fehlens dieser Formel alles andere als akademisch.
 
Nikolai Semko:
es ist tatsächlich eine Herausforderung, keine einfache.
Aber wer sie alleine lösen kann, der darf sich zu Recht als Farbguru bezeichnen.

Wie das? Haben Sie selbst damit experimentiert? Wahrscheinlich die obere Farbe als Filter verwenden, jede Komponente (rgb) der unteren Ebene im Verhältnis zum Pegel der entsprechenden Komponente der oberen Ebene und der Transparenz berechnen (es wird bestimmt, wie viel von dem, was von der unteren durch die obere hindurchgeht). Dann die Pegel der Komponenten der oberen in Übereinstimmung mit der Deckkraft neu berechnen (es wird bestimmt, wie viel von der oberen übrig bleibt). Berechnen Sie am Ende den Durchschnitt der einzelnen Komponenten der unteren und der oberen Ebene (nicht die ursprüngliche untere und obere Ebene, sondern die neu berechnete, wie geschrieben). Ich habe es nicht ausprobiert.

Naja, oder einfach die Komponenten im Verhältnis zur Transparenz addieren.

Ich werde experimentieren müssen... interessante Aufgabe.

 
Dmitry Fedoseev:

Wie? Haben Sie selbst damit experimentiert?

Ich habe dieses Problem schon vor vier Jahren gelöst, allerdings mit viel Brainstorming.
Ich werde die Lösung posten, wenn ich sehe, dass viel Gehirnaktivität stattfindet und niemand die Lösung findet.
 

Uffff... Es stellte sich heraus, dass alles viel einfacher ist, da man vor dem Stapeln nicht filtern muss. Die Komponenten werden einfach im Verhältnis zu Transparenz und Deckkraft hinzugefügt:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - die obere Ebene ist undurchsichtig, 0 - völlig transparent.

lr, lg, lb - Komponenten der unteren Ebene.

ur, ug, ub - Komponenten der oberen Ebene.

Hier im Terminal, schwarzer Hintergrund, rotes Quadrat undurchsichtig, darauf blau mit 50% Transparenz und dann gelb mit 50% Transparenz.

Hier ist die gleiche Sache in Photoshop:


 
Dmitry Fedoseev:

Uffff... Es stellte sich heraus, dass alles viel einfacher ist, da man vor dem Stapeln nicht filtern muss. Die Komponenten werden einfach im Verhältnis zu Transparenz und Deckkraft hinzugefügt:

Alpha: 255 - die oberste Ebene ist undurchsichtig, 0 - völlig transparent.

lr, lg, lb - Komponenten der unteren Ebene.

ur, ug, ub - Komponenten der oberen Ebene.

Wenn ich an meinem Computer bin, werde ich versuchen, zwei transparente Bilder mit dieser Formel zu mischen und zu sehen, was passiert. :))
 
Nikolai Semko:
Ich werde an meinen Computer gehen und versuchen, zwei transparente Bilder mit dieser Formel zu mischen und zu sehen, was passiert. :))

Wie kann man zwei transparente Bilder mischen? Das erste Bild wird über den Hintergrund gelegt, dann wird das zweite über das Ergebnis gelegt.

Generell kann man auch zwei transparente Bilder irgendwie falten und dann über den Hintergrund legen, aber darum geht es jetzt nicht.

***

Besonders interessant wäre es, alle Methoden des Überlagerns von Ebenen wie in Photoshop zu lernen.

 
Dmitry Fedoseev:

Uffff... Es stellte sich heraus, dass alles viel einfacher ist, da man vor dem Stapeln nicht filtern muss. Die Komponenten werden einfach im Verhältnis zu Transparenz und Deckkraft hinzugefügt:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alpha: 255 - die oberste Ebene ist undurchsichtig, 0 - völlig transparent.

lr, lg, lb - Komponenten der unteren Ebene.

ur, ug, ub - Komponenten der oberen Ebene.

Hier im Terminal, schwarzer Hintergrund, rotes Quadrat undurchsichtig, darauf blau mit 50% Transparenz und dann gelb mit 50% Transparenz.

Hier ist das gleiche in Photoshop:

nicht das ...

der Punkt ist, dass es Alpha1 und Alpha2 gibt.

Sie müssen also nicht nur die neu entstehenden Mischfarben berechnen, sondern auch die neu entstehende Transparenz.

Du hast im Wesentlichen die Formel des Autors des Artikels wiederholt, der die transparente Farbe mit dem Hintergrund mischt:

result=backgraund*(1-alpha)+foreground

und das haben Sie:

result=backgraund*(1-alpha)+foreground*alpha

Deine Variante ist richtig, aber der Autor des Artikels hat einen Fehler in einer einfachen Formel gemacht, und es ist lustig, dass Peter ihm für diese Formel dankt:))))

Immerhin kann man mit bloßem Auge sehen, dass in der Formel des Autors ein uchar-Überlauf leicht auftritt. Es ist seltsam, dass seit 4 Jahren niemand diesen groben Fehler gesehen hat.

 

Hier wird der Algorithmus zum Mischen anderer transparenter Farben angewendet:


 
Warum zwei transparente Schichten mischen und dann auftragen? Tragen Sie erst eine Schicht auf, dann die andere.