Warum wirkt sich Farbbrand nicht auf einen weißen Kanal aus?

Ich habe ein unerwartetes Verhalten mit dem Mischmodus „ Farbe brennen “ in Adobe Photoshop CS 5 (und CS 6).

Mein Verständnis des Mischmodus ist das folgende ( https://helpx.adobe.com/photoshop/using/blending-modes.html ):

Color Burn : Betrachtet die Farbinformationen in jedem Kanal und verdunkelt die Grundfarbe, um die Mischfarbe widerzuspiegeln, indem der Kontrast zwischen den beiden erhöht wird. Das Mischen mit Weiß ergibt keine Änderung.

Ich habe folgende Konstellation:

  • Oberste Ebene, komplett schwarz (#000000), auf Color Burn - Mischmodus eingestellt
  • Untere Lage, komplett weiß (#FFFFFF)

Mein erwartetes Ergebnis ist eine vollständig schwarze Farbe (#000000). Mein tatsächliches Ergebnis ist eine vollständig weiße Farbe (#FFFFFF).

Wenn ich jedoch die untere Ebene nur geringfügig ändere, zB auf einen Wert von fast Weiß wie #FEFFFF (254, 255, 255 in RGB), erhalte ich das erwartete Ergebnis eines vollständig ausgesparten Kanals (#00FFFF).

Wenn in der Dokumentation steht blending with white produces no change, erwarte ich, dass damit die oberste Ebene gemeint ist (dh die Mischebene)?

Warum ist dieser Mischmodus nicht "aktiviert", wenn ein Kanal in der Basisebene vollständig weiß ist?

Das folgende Bild zeigt die beispielhaften Ergebnisse (in CS5):

Farbbrandmischung, wenn die oberste Schicht vollständig schwarz und die Basisschicht vollständig weiß ist

Farbbrandmischung, wenn die oberste Schicht vollständig schwarz und die Basisschicht nur fast weiß ist


HINWEIS: Interessanterweise tritt das gleiche Problem beim Farbabwedeln auf (wenn Sie alle Referenzen von Weiß zu Schwarz und umgekehrt umkehren). Immer wenn ein Kanal in der Farbabwedel-Basisebene etwas über 0 liegt, wird der Mischmodus aktiviert.


Bearbeiten

Dies passiert auch, wenn der Top-Layer von Null verschieden ist, zB #040404.

Gemäß den verfügbaren Algorithmen, die ich mir online angesehen habe, ist der Eckfall nur dann gegeben, wenn die oberste Schicht vollständig schwarz ist, aber diese Algorithmen verwenden dann als Ergebnis die oberste Schicht (und nicht die unterste Schicht).

Beispiel:

if b = 0 then
  result := 0
else begin
  c := 255 - (((255-a) SHL 8) DIV b);
  if c < 0 then result := 0 else result := c;
end;

Wobei a die Basisschicht (untere Schicht) und b die Mischschicht (obere Schicht) ist.

(Siehe https://stackoverflow.com/questions/5919663/how-does-photoshop-blend-two-images-together oder http://www.pegtop.net/delphi/articles/blendmodes/burn.htm )

Da das gleiche Verhalten auftritt, wenn die oberste Ebene von Null abweicht, scheint PS einen Sonderfall für einen Basiskanalwert von 255 zu haben. Dies ist höchstwahrscheinlich auf eine willkürliche Entscheidung von Adobe zurückzuführen, die sich nicht in anderen Algorithmen widerspiegelt.

Dies ist meiner Meinung nach eine gute Frage, aber es hängen einige enge Stimmen daran, weil es etwas verwirrend ist (und mehr war). Anscheinend haben wir vergessen, Sie zu begrüßen. Willkommen bei GD.SE, wir freuen uns, Sie als Mitglied zu haben... Jetzt haben wir es geschafft.

Antworten (2)

Die Division durch Null ist nicht definiert. Das Image intakt zu lassen, ist die einzig mögliche Lösung. Siehe Wikipedia zu Mischmodi. Das ist in einigen Fällen etwas problematisch, aber die Verwendung von reinem Schwarzbrand ist sowieso nicht wirklich sinnvoll. Mehrfach verwenden.

Ausweichen ist rückwärts brennen. Vermutlich wollten sie also, dass es die gleichen Eckenbeschränkungen hat.

Anmerkungen zum Erläuterungsformular : Die Auswahl ist willkürlich, da die Division durch Null nicht definiert ist.

Dies passiert auch, wenn der Top-Layer von Null verschieden ist, zB #040404. Gemäß den verfügbaren Algorithmen, die ich mir online angesehen habe, ist der Eckfall nur dann gegeben, wenn die oberste Schicht vollständig schwarz ist, aber diese Algorithmen verwenden dann als Ergebnis die oberste Schicht (und nicht die unterste Schicht). (Siehe stackoverflow.com/questions/5919663/… oder pegtop.net/delphi/articles/blendmodes/burn.htm ) Da das gleiche Verhalten auftritt, wenn die oberste Schicht von Null abweicht, scheint es, als hätte PS einen Sonderfall für ein komplett weißer Basiskanal?
@Gedde Adobe macht viele seltsame Sachen. Sogar ihre Gamma-Korrektur ist subtil falsch und niemand kümmert sich darum. Aber ja, genau das passiert, wenn Entwickler auf eine Situation stoßen, in der eine willkürliche Wahl ansteht. Die Hälfte der Kunden mag es nicht, weil sie denken, Sie hätten die andere Option wählen sollen ... OTOH, wenn Sie es anders gemacht hätten, hätten Sie die andere Hälfte in den Armen.
@Gedde Sie können dieses Problem vermeiden, indem Sie die Alter-Layar-Optionen so anpassen, dass die Farbausgabe der Layer-Clips bei 1 pr 254, also nicht 0 oder 255 verfügbar ist.
Ok, es sieht so aus, als wäre dies nur eine willkürliche Entscheidung von Adobe, wie Sie in Ihrem ersten Kommentar angeben. Vielen Dank auch für die Problemumgehung.
Ich werde dies nicht als Antwort markieren, da in der Antwort "Division durch Null ist undefiniert" steht. Das eigentliche Problem ist jedoch kein Eckfall der Division durch Null, sondern ein Eckfall, wenn der untere Kanal 255 ist (was nicht sein sollte ein Eckfall, nach meinem Verständnis). Wann immer jemand erklären kann, warum der Eckfall von 255 für den unteren Kanal den Farbbrenn-Mischmodus nicht mehr funktioniert, werde ich diese Antwort als akzeptiert bezeichnen.
Weil Burn unten durch den invertierten Kanal geteilt wird. Inversion von 255 ist 0. Wie auch immer, es macht mir nichts aus (es ist nett von Ihnen, tatsächlich zu helfen, Fragen zu klären). Ich könnte dies bearbeiten, um es später klarzustellen, jetzt muss ich wirklich gehen und die Kinder abholen.

Es ist im Grunde ein Implementierungsdetail.

Basierend auf Tests scheint Adobe dem normalen Algorithmus [1] für das Einbrennen von Farben eine zusätzliche Bedingung hinzugefügt zu haben.

Der normale Algorithmus ist:

if b = 0 then
  result := 0
else begin
  c := 255 - (((255-a) SHL 8) DIV b);
  if c < 0 then result := 0 else result := c;
end;

wobei a die obere Schicht (Mischschicht) und b die untere Schicht (die Basisschicht) ist.

Die Implementierung von Adobe scheint jedoch zu sein:

// Start of extra test
if a = 255 then
  result := 255
// End of extra test
else if b = 0 then
  result := 0
else begin
  c := 255 - (((255-a) SHL 8) DIV b);
  if c < 0 then result := 0 else result := c;
end;

Beachten Sie den zusätzlichen Test am Anfang. Dies wird wahrscheinlich hinzugefügt, da dies die konsistentesten Ergebnisse liefert, wenn die Basisschicht vollständig weiß ist. Alle anderen oberen Schichten als vollständig schwarz geben Weiß zurück, und deshalb haben sie sich entschieden, Weiß auch dann zurückzugeben, wenn die oberste Schicht vollständig schwarz ist (wobei es implementierungsspezifisch ist, was zurückgegeben werden soll).

[1] = http://www.pegtop.net/delphi/articles/blendmodes/burn.htm